aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorAdam Frisby2007-07-11 08:10:25 +0000
committerAdam Frisby2007-07-11 08:10:25 +0000
commite2ff441e31328e60c8bb1d4bb32fa4ac64f91978 (patch)
tree8405b6cef57b66a58f31a24c859846085d0b81f7 /OpenSim/Region
parent* Wiping trunk in prep for Sugilite (diff)
parent* Applying dalien's patches from bug#177 and #179 (diff)
downloadopensim-SC-e2ff441e31328e60c8bb1d4bb32fa4ac64f91978.zip
opensim-SC-e2ff441e31328e60c8bb1d4bb32fa4ac64f91978.tar.gz
opensim-SC-e2ff441e31328e60c8bb1d4bb32fa4ac64f91978.tar.bz2
opensim-SC-e2ff441e31328e60c8bb1d4bb32fa4ac64f91978.tar.xz
* Bringing Sugilite in to trunk
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Application/Application.cs120
-rw-r--r--OpenSim/Region/Application/OpenSimMain.cs482
-rw-r--r--OpenSim/Region/Application/VersionInfo.cs36
-rw-r--r--OpenSim/Region/Caches/AssetCache.cs669
-rw-r--r--OpenSim/Region/Caches/Properties/AssemblyInfo.cs33
-rw-r--r--OpenSim/Region/Capabilities/Caps.cs336
-rw-r--r--OpenSim/Region/Capabilities/LLSDArray.cs42
-rw-r--r--OpenSim/Region/Capabilities/LLSDCapEvent.cs41
-rw-r--r--OpenSim/Region/Capabilities/LLSDCapsDetails.cs15
-rw-r--r--OpenSim/Region/Capabilities/LLSDEmpty.cs38
-rw-r--r--OpenSim/Region/Capabilities/LLSDHelpers.cs164
-rw-r--r--OpenSim/Region/Capabilities/LLSDMapLayer.cs46
-rw-r--r--OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs41
-rw-r--r--OpenSim/Region/Capabilities/LLSDMapRequest.cs13
-rw-r--r--OpenSim/Region/Capabilities/LLSDMethod.cs8
-rw-r--r--OpenSim/Region/Capabilities/LLSDStreamHandler.cs42
-rw-r--r--OpenSim/Region/Capabilities/LLSDTest.cs41
-rw-r--r--OpenSim/Region/Capabilities/LLSDType.cs59
-rw-r--r--OpenSim/Region/Capabilities/LLSDUploadReply.cs44
-rw-r--r--OpenSim/Region/ClientStack/Assets/InventoryCache.cs337
-rw-r--r--OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs40
-rw-r--r--OpenSim/Region/ClientStack/ClientView.API.cs1122
-rw-r--r--OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs357
-rw-r--r--OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs236
-rw-r--r--OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs596
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs293
-rw-r--r--OpenSim/Region/ClientStack/ClientViewBase.cs326
-rw-r--r--OpenSim/Region/ClientStack/PacketServer.cs184
-rw-r--r--OpenSim/Region/ClientStack/RegionApplicationBase.cs117
-rw-r--r--OpenSim/Region/ClientStack/UDPServer.cs196
-rw-r--r--OpenSim/Region/Communications/Local/CommunicationsLocal.cs54
-rw-r--r--OpenSim/Region/Communications/Local/LocalBackEndServices.cs206
-rw-r--r--OpenSim/Region/Communications/Local/LocalUserServices.cs142
-rw-r--r--OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs33
-rw-r--r--OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs18
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs378
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs69
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1UserServices.cs105
-rw-r--r--OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs33
-rw-r--r--OpenSim/Region/Environment/EstateManager.cs300
-rw-r--r--OpenSim/Region/Environment/ParcelManager.cs891
-rw-r--r--OpenSim/Region/Environment/RegionManager.cs29
-rw-r--r--OpenSim/Region/Environment/Scenes/Entity.cs115
-rw-r--r--OpenSim/Region/Environment/Scenes/EntityBase.cs142
-rw-r--r--OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs14
-rw-r--r--OpenSim/Region/Environment/Scenes/Primitive.cs594
-rw-r--r--OpenSim/Region/Environment/Scenes/PrimitiveOld.cs583
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs570
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs806
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneBase.cs198
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneEvents.cs50
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObject.cs246
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs74
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs85
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs597
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs102
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs102
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs45
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs503
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs43
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs135
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs427
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs96
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs40
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs29
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs45
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs46
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs37
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs171
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs42
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs49
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs119
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs10
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs10
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs16
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs10
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs10
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs16
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs16
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Script.cs64
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs25
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs58
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs99
-rw-r--r--OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs10
-rw-r--r--OpenSim/Region/Examples/SimpleApp/MyWorld.cs93
-rw-r--r--OpenSim/Region/Examples/SimpleApp/Program.cs130
-rw-r--r--OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs31
-rw-r--r--OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs56
-rw-r--r--OpenSim/Region/GridInterfaces/Local/LocalAssetServer.cs311
-rw-r--r--OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs56
-rw-r--r--OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs133
-rw-r--r--OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs56
-rw-r--r--OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs301
-rw-r--r--OpenSim/Region/Physics/Manager/AssemblyInfo.cs56
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsActor.cs167
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsManager.cs115
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsScene.cs110
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsVector.cs55
-rw-r--r--OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs56
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs457
-rw-r--r--OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs56
-rw-r--r--OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs425
-rw-r--r--OpenSim/Region/Scripting/Properties/AssemblyInfo.cs35
-rw-r--r--OpenSim/Region/Scripting/Script.cs32
-rw-r--r--OpenSim/Region/Scripting/ScriptAccess.cs31
-rw-r--r--OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs112
-rw-r--r--OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs56
-rw-r--r--OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs267
-rw-r--r--OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs39
-rw-r--r--OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs47
-rw-r--r--OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs47
-rw-r--r--OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs60
-rw-r--r--OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs198
-rw-r--r--OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs60
-rw-r--r--OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs928
-rw-r--r--OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs126
116 files changed, 19483 insertions, 0 deletions
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
new file mode 100644
index 0000000..0428f5a
--- /dev/null
+++ b/OpenSim/Region/Application/Application.cs
@@ -0,0 +1,120 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using OpenSim.Framework.Console;
30using OpenSim.Region.Environment.Scenes;
31
32namespace OpenSim
33{
34 public class Application
35 {
36 //could move our main function into OpenSimMain and kill this class
37 [STAThread]
38 public static void Main(string[] args)
39 {
40 Console.WriteLine("OpenSim " + VersionInfo.Version + "\n");
41 Console.WriteLine("Starting...\n");
42
43 bool sandBoxMode = false;
44 bool startLoginServer = false;
45 string physicsEngine = "basicphysics";
46 bool allowFlying = false;
47 bool userAccounts = false;
48 bool gridLocalAsset = false;
49 bool useConfigFile = false;
50 bool silent = false;
51 string configFile = "simconfig.xml";
52
53 for (int i = 0; i < args.Length; i++)
54 {
55 if (args[i] == "-sandbox")
56 {
57 sandBoxMode = true;
58 startLoginServer = true;
59 }
60 /*
61 if (args[i] == "-loginserver")
62 {
63 startLoginServer = true;
64 }*/
65 if (args[i] == "-accounts")
66 {
67 userAccounts = true;
68 }
69 if (args[i] == "-realphysx")
70 {
71 physicsEngine = "RealPhysX";
72 allowFlying = true;
73 }
74 if (args[i] == "-ode")
75 {
76 physicsEngine = "OpenDynamicsEngine";
77 allowFlying = true;
78 }
79 if (args[i] == "-localasset")
80 {
81 gridLocalAsset = true;
82 }
83 if (args[i] == "-configfile")
84 {
85 useConfigFile = true;
86 }
87 if (args[i] == "-noverbose")
88 {
89 silent = true;
90 }
91 if (args[i] == "-config")
92 {
93 try
94 {
95 i++;
96 configFile = args[i];
97 }
98 catch (Exception e)
99 {
100 Console.WriteLine("-config: Please specify a config file. (" + e.ToString() + ")");
101 }
102 }
103 }
104
105 OpenSimMain sim = new OpenSimMain(sandBoxMode, startLoginServer, physicsEngine, useConfigFile, silent, configFile);
106 // OpenSimRoot.Instance.Application = sim;
107 sim.m_sandbox = sandBoxMode;
108 sim.user_accounts = userAccounts;
109 sim.gridLocalAsset = gridLocalAsset;
110 ScenePresence.PhysicsEngineFlying = allowFlying;
111
112 sim.StartUp();
113
114 while (true)
115 {
116 MainLog.Instance.MainLogPrompt();
117 }
118 }
119 }
120}
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
new file mode 100644
index 0000000..728329e
--- /dev/null
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -0,0 +1,482 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28
29using System;
30using System.IO;
31using libsecondlife;
32using OpenSim.Assets;
33using OpenSim.Framework;
34using OpenSim.Framework.Communications;
35using OpenSim.Framework.Console;
36using OpenSim.Framework.Data;
37using OpenSim.Framework.Interfaces;
38using OpenSim.Framework.Servers;
39using OpenSim.Framework.Types;
40using OpenSim.GenericConfig;
41using OpenSim.Physics.Manager;
42using OpenSim.Region.Caches;
43using OpenSim.Region.ClientStack;
44using OpenSim.Region.Communications.Local;
45using OpenSim.Region.Communications.OGS1;
46using OpenSim.Region.Environment.Scenes;
47using System.Text;
48
49namespace OpenSim
50{
51
52 public class OpenSimMain : RegionApplicationBase, conscmd_callback
53 {
54 protected CommunicationsManager commsManager;
55 // private CheckSumServer checkServer;
56
57 private bool m_silent;
58 private string m_logFilename = "region-console-" + Guid.NewGuid().ToString() + ".log";
59
60 public OpenSimMain(bool sandBoxMode, bool startLoginServer, string physicsEngine, bool useConfigFile, bool silent, string configFile)
61 {
62 this.configFileSetup = useConfigFile;
63 m_sandbox = sandBoxMode;
64 m_loginserver = startLoginServer;
65 m_physicsEngine = physicsEngine;
66 m_config = configFile;
67 m_silent = silent;
68 }
69
70 /// <summary>
71 /// Performs initialisation of the world, such as loading configuration from disk.
72 /// </summary>
73 public override void StartUp()
74 {
75 this.serversData = new NetworkServersInfo();
76
77 this.localConfig = new XmlConfig(m_config);
78 this.localConfig.LoadData();
79
80 if (this.configFileSetup)
81 {
82 this.SetupFromConfigFile(this.localConfig);
83 }
84
85 m_log = new LogBase(m_logFilename, "Region", this, m_silent);
86 MainLog.Instance = m_log;
87
88 m_log.Verbose("Main.cs:Startup() - Loading configuration");
89 this.serversData.InitConfig(this.m_sandbox, this.localConfig);
90 this.localConfig.Close();//for now we can close it as no other classes read from it , but this should change
91
92 ScenePresence.LoadTextureFile("avatar-texture.dat");
93
94 ClientView.TerrainManager = new TerrainManager(new SecondLife());
95
96 this.SetupHttpListener();
97
98 if (m_sandbox)
99 {
100 this.SetupLocalGridServers();
101 // this.checkServer = new CheckSumServer(12036);
102 // this.checkServer.ServerListener();
103 }
104 else
105 {
106 this.SetupRemoteGridServers();
107 }
108
109 startuptime = DateTime.Now;
110
111 this.physManager = new PhysicsManager();
112 this.physManager.LoadPlugins();
113
114 this.SetupWorld();
115
116 m_log.Verbose("Main.cs:Startup() - Initialising HTTP server");
117
118 if (m_sandbox)
119 {
120 httpServer.AddXmlRPCHandler("login_to_simulator", ((CommunicationsLocal)this.commsManager).UserServices.XmlRpcLoginMethod);
121 }
122
123 //Start http server
124 m_log.Verbose("Main.cs:Startup() - Starting HTTP server");
125 httpServer.Start();
126
127 // Start UDP servers
128 for (int i = 0; i < m_udpServer.Count; i++)
129 {
130 this.m_udpServer[i].ServerListener();
131 }
132
133 }
134
135 # region Setup methods
136 protected override void SetupLocalGridServers()
137 {
138 try
139 {
140 AssetCache = new AssetCache("OpenSim.Region.GridInterfaces.Local.dll", this.serversData.AssetURL, this.serversData.AssetSendKey);
141 InventoryCache = new InventoryCache();
142 this.commsManager = new CommunicationsLocal(this.serversData, httpServer);
143 }
144 catch (Exception e)
145 {
146 m_log.Error(e.Message + "\nSorry, could not setup local cache");
147 Environment.Exit(1);
148 }
149
150 }
151
152 protected override void SetupRemoteGridServers()
153 {
154 try
155 {
156 AssetCache = new AssetCache("OpenSim.Region.GridInterfaces.Local.dll", this.serversData.AssetURL, this.serversData.AssetSendKey);
157 InventoryCache = new InventoryCache();
158 this.commsManager = new CommunicationsOGS1(this.serversData, httpServer);
159 }
160 catch (Exception e)
161 {
162 m_log.Error(e.Message + "\nSorry, could not setup remote cache");
163 Environment.Exit(1);
164 }
165 }
166
167 protected override void SetupWorld()
168 {
169 IGenericConfig regionConfig;
170 Scene LocalWorld;
171 UDPServer udpServer;
172 RegionInfo regionDat = new RegionInfo();
173 AuthenticateSessionsBase authenBase;
174
175 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Regions");
176 string[] configFiles = Directory.GetFiles(path, "*.xml");
177
178 if (configFiles.Length == 0)
179 {
180 string path2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Regions");
181 string path3 = Path.Combine(path2, "default.xml");
182 Console.WriteLine("Creating default region config file");
183 //TODO create default region
184 IGenericConfig defaultConfig = new XmlConfig(path3);
185 defaultConfig.LoadData();
186 defaultConfig.Commit();
187 defaultConfig.Close();
188 defaultConfig = null;
189 configFiles = Directory.GetFiles(path, "*.xml");
190 }
191
192 for (int i = 0; i < configFiles.Length; i++)
193 {
194 regionDat = new RegionInfo();
195 if (m_sandbox)
196 {
197 AuthenticateSessionsBase authen = new AuthenticateSessionsBase(); // new AuthenticateSessionsLocal();
198 this.AuthenticateSessionsHandler.Add(authen);
199 authenBase = authen;
200 }
201 else
202 {
203 AuthenticateSessionsBase authen = new AuthenticateSessionsBase(); //new AuthenticateSessionsRemote();
204 this.AuthenticateSessionsHandler.Add(authen);
205 authenBase = authen;
206 }
207 Console.WriteLine("Loading region config file");
208 regionConfig = new XmlConfig(configFiles[i]);
209 regionConfig.LoadData();
210 regionDat.InitConfig(this.m_sandbox, regionConfig);
211 regionConfig.Close();
212
213 udpServer = new UDPServer(regionDat.InternalEndPoint.Port, this.AssetCache, this.InventoryCache, this.m_log, authenBase);
214
215 m_udpServer.Add(udpServer);
216 this.regionData.Add(regionDat);
217
218 LocalWorld = new Scene(udpServer.PacketServer.ClientManager, regionDat, authenBase, commsManager, this.AssetCache, httpServer);
219 this.m_localWorld.Add(LocalWorld);
220 //LocalWorld.InventoryCache = InventoryCache;
221 //LocalWorld.AssetCache = AssetCache;
222
223 udpServer.LocalWorld = LocalWorld;
224
225 LocalWorld.LoadStorageDLL("OpenSim.Region.Storage.LocalStorageDb4o.dll"); //all these dll names shouldn't be hard coded.
226 LocalWorld.LoadWorldMap();
227
228 m_log.Verbose("Main.cs:Startup() - Starting up messaging system");
229 LocalWorld.PhysScene = this.physManager.GetPhysicsScene(this.m_physicsEngine);
230 LocalWorld.PhysScene.SetTerrain(LocalWorld.Terrain.getHeights1D());
231 LocalWorld.LoadPrimsFromStorage();
232
233 //Master Avatar Setup
234 UserProfileData masterAvatar = commsManager.UserServer.SetupMasterUser(LocalWorld.RegionInfo.MasterAvatarFirstName, LocalWorld.RegionInfo.MasterAvatarLastName, LocalWorld.RegionInfo.MasterAvatarSandboxPassword);
235 if (masterAvatar != null)
236 {
237 LocalWorld.RegionInfo.MasterAvatarAssignedUUID = masterAvatar.UUID;
238 LocalWorld.localStorage.LoadParcels((ILocalStorageParcelReceiver)LocalWorld.parcelManager);
239 }
240
241
242 LocalWorld.StartTimer();
243 }
244 }
245
246 private class SimStatusHandler : IStreamHandler
247 {
248 public byte[] Handle(string path, Stream request)
249 {
250 return Encoding.UTF8.GetBytes("OK");
251 }
252
253 public string ContentType
254 {
255 get { return "text/plain"; }
256 }
257
258 public string HttpMethod
259 {
260 get { return "GET"; }
261 }
262
263 public string Path
264 {
265 get { return "/simstatus/"; }
266 }
267 }
268
269 protected override void SetupHttpListener()
270 {
271 httpServer = new BaseHttpServer(this.serversData.HttpListenerPort); //regionData[0].IPListenPort);
272
273 if (!this.m_sandbox)
274 {
275 httpServer.AddStreamHandler( new SimStatusHandler() );
276 }
277 }
278
279 protected override void ConnectToRemoteGridServer()
280 {
281
282 }
283
284 #endregion
285
286 private void SetupFromConfigFile(IGenericConfig configData)
287 {
288 // Log filename
289 string attri = "";
290 attri = configData.GetAttribute("LogFilename");
291 if (String.IsNullOrEmpty(attri))
292 {
293 }
294 else
295 {
296 m_logFilename = attri;
297 }
298
299 // SandBoxMode
300 attri = "";
301 attri = configData.GetAttribute("SandBox");
302 if ((attri == "") || ((attri != "false") && (attri != "true")))
303 {
304 this.m_sandbox = false;
305 configData.SetAttribute("SandBox", "false");
306 }
307 else
308 {
309 this.m_sandbox = Convert.ToBoolean(attri);
310 }
311
312 // LoginServer
313 attri = "";
314 attri = configData.GetAttribute("LoginServer");
315 if ((attri == "") || ((attri != "false") && (attri != "true")))
316 {
317 this.m_loginserver = false;
318 configData.SetAttribute("LoginServer", "false");
319 }
320 else
321 {
322 this.m_loginserver = Convert.ToBoolean(attri);
323 }
324
325 // Sandbox User accounts
326 attri = "";
327 attri = configData.GetAttribute("UserAccount");
328 if ((attri == "") || ((attri != "false") && (attri != "true")))
329 {
330 this.user_accounts = false;
331 configData.SetAttribute("UserAccounts", "false");
332 }
333 else if (attri == "true")
334 {
335 this.user_accounts = Convert.ToBoolean(attri);
336 }
337
338 // Grid mode hack to use local asset server
339 attri = "";
340 attri = configData.GetAttribute("LocalAssets");
341 if ((attri == "") || ((attri != "false") && (attri != "true")))
342 {
343 this.gridLocalAsset = false;
344 configData.SetAttribute("LocalAssets", "false");
345 }
346 else if (attri == "true")
347 {
348 this.gridLocalAsset = Convert.ToBoolean(attri);
349 }
350
351
352 attri = "";
353 attri = configData.GetAttribute("PhysicsEngine");
354 switch (attri)
355 {
356 default:
357 m_log.Warn("Main.cs: SetupFromConfig() - Invalid value for PhysicsEngine attribute, terminating");
358 Environment.Exit(1);
359 break;
360
361 case "":
362 this.m_physicsEngine = "basicphysics";
363 configData.SetAttribute("PhysicsEngine", "basicphysics");
364 ScenePresence.PhysicsEngineFlying = false;
365 break;
366
367 case "basicphysics":
368 this.m_physicsEngine = "basicphysics";
369 configData.SetAttribute("PhysicsEngine", "basicphysics");
370 ScenePresence.PhysicsEngineFlying = false;
371 break;
372
373 case "RealPhysX":
374 this.m_physicsEngine = "RealPhysX";
375 ScenePresence.PhysicsEngineFlying = true;
376 break;
377
378 case "OpenDynamicsEngine":
379 this.m_physicsEngine = "OpenDynamicsEngine";
380 ScenePresence.PhysicsEngineFlying = true;
381 break;
382 }
383
384 configData.Commit();
385
386 }
387
388 /// <summary>
389 /// Performs any last-minute sanity checking and shuts down the region server
390 /// </summary>
391 public virtual void Shutdown()
392 {
393 m_log.Verbose("Main.cs:Shutdown() - Closing all threads");
394 m_log.Verbose("Main.cs:Shutdown() - Killing listener thread");
395 m_log.Verbose("Main.cs:Shutdown() - Killing clients");
396 // IMPLEMENT THIS
397 m_log.Verbose("Main.cs:Shutdown() - Closing console and terminating");
398 for (int i = 0; i < m_localWorld.Count; i++)
399 {
400 ((Scene)m_localWorld[i]).Close();
401 }
402 m_log.Close();
403 Environment.Exit(0);
404 }
405
406 #region Console Commands
407 /// <summary>
408 /// Runs commands issued by the server console from the operator
409 /// </summary>
410 /// <param name="command">The first argument of the parameter (the command)</param>
411 /// <param name="cmdparams">Additional arguments passed to the command</param>
412 public void RunCmd(string command, string[] cmdparams)
413 {
414 switch (command)
415 {
416 case "help":
417 m_log.Error("show users - show info about connected users");
418 m_log.Error("shutdown - disconnect all clients and shutdown");
419 break;
420
421 case "show":
422 if (cmdparams.Length > 0)
423 {
424 Show(cmdparams[0]);
425 }
426 break;
427
428 case "terrain":
429 string result = "";
430 for (int i = 0; i < m_localWorld.Count; i++)
431 {
432 if (!((Scene)m_localWorld[i]).Terrain.RunTerrainCmd(cmdparams, ref result, m_localWorld[i].RegionInfo.RegionName))
433 {
434 m_log.Error(result);
435 }
436 }
437 break;
438
439 case "shutdown":
440 Shutdown();
441 break;
442
443 default:
444 m_log.Error("Unknown command");
445 break;
446 }
447 }
448
449 /// <summary>
450 /// Outputs to the console information about the region
451 /// </summary>
452 /// <param name="ShowWhat">What information to display (valid arguments are "uptime", "users")</param>
453 public void Show(string ShowWhat)
454 {
455 switch (ShowWhat)
456 {
457 case "uptime":
458 m_log.Error("OpenSim has been running since " + startuptime.ToString());
459 m_log.Error("That is " + (DateTime.Now - startuptime).ToString());
460 break;
461 case "users":
462 ScenePresence TempAv;
463 m_log.Error(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}{6,-16}", "Firstname", "Lastname", "Agent ID", "Session ID", "Circuit", "IP", "World"));
464 for (int i = 0; i < m_localWorld.Count; i++)
465 {
466 foreach (libsecondlife.LLUUID UUID in ((Scene)m_localWorld[i]).Entities.Keys)
467 {
468 if (((Scene)m_localWorld[i]).Entities[UUID].ToString() == "OpenSim.world.Avatar")
469 {
470 TempAv = (ScenePresence)((Scene)m_localWorld[i]).Entities[UUID];
471 m_log.Error(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}", TempAv.firstname, TempAv.lastname, UUID, TempAv.ControllingClient.AgentId, "Unknown", "Unknown"), ((Scene)m_localWorld[i]).RegionInfo.RegionName);
472 }
473 }
474 }
475 break;
476 }
477 }
478 #endregion
479 }
480
481
482}
diff --git a/OpenSim/Region/Application/VersionInfo.cs b/OpenSim/Region/Application/VersionInfo.cs
new file mode 100644
index 0000000..2c720a3
--- /dev/null
+++ b/OpenSim/Region/Application/VersionInfo.cs
@@ -0,0 +1,36 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28namespace OpenSim
29{
30 /// <summary>
31 /// </summary>
32 public class VersionInfo
33 {
34 public static string Version = "0.3, SVN build ";
35 }
36}
diff --git a/OpenSim/Region/Caches/AssetCache.cs b/OpenSim/Region/Caches/AssetCache.cs
new file mode 100644
index 0000000..453edbe
--- /dev/null
+++ b/OpenSim/Region/Caches/AssetCache.cs
@@ -0,0 +1,669 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28
29using System;
30using System.Collections.Generic;
31using System.Reflection;
32using System.Threading;
33using libsecondlife;
34using libsecondlife.Packets;
35using OpenSim.Framework.Interfaces;
36using OpenSim.Framework.Types;
37
38namespace OpenSim.Region.Caches
39{
40 public delegate void DownloadComplete(AssetCache.TextureSender sender);
41
42 /// <summary>
43 /// Manages local cache of assets and their sending to viewers.
44 /// </summary>
45 public class AssetCache : IAssetReceiver
46 {
47 public Dictionary<LLUUID, AssetInfo> Assets;
48 public Dictionary<LLUUID, TextureImage> Textures;
49
50 public List<AssetRequest> AssetRequests = new List<AssetRequest>(); //assets ready to be sent to viewers
51 public List<AssetRequest> TextureRequests = new List<AssetRequest>(); //textures ready to be sent
52
53 public Dictionary<LLUUID, AssetRequest> RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); //Assets requested from the asset server
54 public Dictionary<LLUUID, AssetRequest> RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); //Textures requested from the asset server
55
56 public Dictionary<LLUUID, TextureSender> SendingTextures = new Dictionary<LLUUID, TextureSender>();
57 private IAssetServer _assetServer;
58 private Thread _assetCacheThread;
59 private LLUUID[] textureList = new LLUUID[5];
60
61 /// <summary>
62 ///
63 /// </summary>
64 public AssetCache(IAssetServer assetServer)
65 {
66 Console.WriteLine("Creating Asset cache");
67 _assetServer = assetServer;
68 _assetServer.SetReceiver(this);
69 Assets = new Dictionary<LLUUID, AssetInfo>();
70 Textures = new Dictionary<LLUUID, TextureImage>();
71 this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager));
72 this._assetCacheThread.IsBackground = true;
73 this._assetCacheThread.Start();
74
75 }
76
77 public AssetCache(string assetServerDLLName, string assetServerURL, string assetServerKey)
78 {
79 Console.WriteLine("Creating Asset cache");
80 _assetServer = this.LoadAssetDll(assetServerDLLName);
81 _assetServer.SetServerInfo(assetServerURL, assetServerKey);
82 _assetServer.SetReceiver(this);
83 Assets = new Dictionary<LLUUID, AssetInfo>();
84 Textures = new Dictionary<LLUUID, TextureImage>();
85 this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager));
86 this._assetCacheThread.IsBackground = true;
87 this._assetCacheThread.Start();
88
89 }
90
91 /// <summary>
92 ///
93 /// </summary>
94 public void RunAssetManager()
95 {
96 while (true)
97 {
98 try
99 {
100 //Console.WriteLine("Asset cache loop");
101 this.ProcessAssetQueue();
102 this.ProcessTextureQueue();
103 Thread.Sleep(500);
104 }
105 catch (Exception e)
106 {
107 Console.WriteLine(e.Message);
108 }
109 }
110 }
111
112 public void LoadDefaultTextureSet()
113 {
114 //hack: so we can give each user a set of textures
115 textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001");
116 textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002");
117 textureList[2] = new LLUUID("00000000-0000-0000-9999-000000000003");
118 textureList[3] = new LLUUID("00000000-0000-0000-9999-000000000004");
119 textureList[4] = new LLUUID("00000000-0000-0000-9999-000000000005");
120
121 for (int i = 0; i < textureList.Length; i++)
122 {
123 this._assetServer.RequestAsset(textureList[i], true);
124 }
125
126 }
127
128 public AssetBase[] CreateNewInventorySet(LLUUID agentID)
129 {
130 AssetBase[] inventorySet = new AssetBase[this.textureList.Length];
131 for (int i = 0; i < textureList.Length; i++)
132 {
133 if (this.Textures.ContainsKey(textureList[i]))
134 {
135 inventorySet[i] = this.CloneImage(agentID, this.Textures[textureList[i]]);
136 TextureImage image = new TextureImage(inventorySet[i]);
137 this.Textures.Add(image.FullID, image);
138 this._assetServer.UploadNewAsset(image); //save the asset to the asset server
139 }
140 }
141 return inventorySet;
142 }
143
144 public AssetBase GetAsset(LLUUID assetID)
145 {
146 AssetBase asset = null;
147 if (this.Textures.ContainsKey(assetID))
148 {
149 asset = this.Textures[assetID];
150 }
151 else if (this.Assets.ContainsKey(assetID))
152 {
153 asset = this.Assets[assetID];
154 }
155 return asset;
156 }
157
158 public void AddAsset(AssetBase asset)
159 {
160 // Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated());
161 if (asset.Type == 0)
162 {
163 //Console.WriteLine("which is a texture");
164 if (!this.Textures.ContainsKey(asset.FullID))
165 { //texture
166 TextureImage textur = new TextureImage(asset);
167 this.Textures.Add(textur.FullID, textur);
168 this._assetServer.UploadNewAsset(asset);
169 }
170 }
171 else
172 {
173 if (!this.Assets.ContainsKey(asset.FullID))
174 {
175 AssetInfo assetInf = new AssetInfo(asset);
176 this.Assets.Add(assetInf.FullID, assetInf);
177 this._assetServer.UploadNewAsset(asset);
178 }
179 }
180 }
181
182 /// <summary>
183 ///
184 /// </summary>
185 private void ProcessTextureQueue()
186 {
187 if (this.TextureRequests.Count == 0)
188 {
189 //no requests waiting
190 return;
191 }
192 int num;
193 num = this.TextureRequests.Count;
194
195 AssetRequest req;
196 for (int i = 0; i < num; i++)
197 {
198 req = (AssetRequest)this.TextureRequests[i];
199 if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID))
200 {
201 TextureSender sender = new TextureSender(req);
202 sender.OnComplete += this.TextureSent;
203 lock (this.SendingTextures)
204 {
205 this.SendingTextures.Add(req.ImageInfo.FullID, sender);
206 }
207 }
208
209 }
210
211 this.TextureRequests.Clear();
212 }
213
214 /// <summary>
215 /// Event handler, called by a TextureSender object to say that texture has been sent
216 /// </summary>
217 /// <param name="sender"></param>
218 public void TextureSent(TextureSender sender)
219 {
220 if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID))
221 {
222 lock (this.SendingTextures)
223 {
224 this.SendingTextures.Remove(sender.request.ImageInfo.FullID);
225 }
226 }
227 }
228
229 public void AssetReceived(AssetBase asset, bool IsTexture)
230 {
231 if (asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server
232 {
233 //check if it is a texture or not
234 //then add to the correct cache list
235 //then check for waiting requests for this asset/texture (in the Requested lists)
236 //and move those requests into the Requests list.
237 if (IsTexture)
238 {
239 TextureImage image = new TextureImage(asset);
240 this.Textures.Add(image.FullID, image);
241 if (this.RequestedTextures.ContainsKey(image.FullID))
242 {
243 AssetRequest req = this.RequestedTextures[image.FullID];
244 req.ImageInfo = image;
245 if (image.Data.LongLength > 600)
246 {
247 //over 600 bytes so split up file
248 req.NumPackets = 1 + (int)(image.Data.Length - 600 + 999) / 1000;
249 }
250 else
251 {
252 req.NumPackets = 1;
253 }
254 this.RequestedTextures.Remove(image.FullID);
255 this.TextureRequests.Add(req);
256 }
257 }
258 else
259 {
260 AssetInfo assetInf = new AssetInfo(asset);
261 this.Assets.Add(assetInf.FullID, assetInf);
262 if (this.RequestedAssets.ContainsKey(assetInf.FullID))
263 {
264 AssetRequest req = this.RequestedAssets[assetInf.FullID];
265 req.AssetInf = assetInf;
266 if (assetInf.Data.LongLength > 600)
267 {
268 //over 600 bytes so split up file
269 req.NumPackets = 1 + (int)(assetInf.Data.Length - 600 + 999) / 1000;
270 }
271 else
272 {
273 req.NumPackets = 1;
274 }
275 this.RequestedAssets.Remove(assetInf.FullID);
276 this.AssetRequests.Add(req);
277 }
278 }
279 }
280 }
281
282 public void AssetNotFound(AssetBase asset)
283 {
284 //the asset server had no knowledge of requested asset
285
286 }
287
288 #region Assets
289 /// <summary>
290 ///
291 /// </summary>
292 /// <param name="userInfo"></param>
293 /// <param name="transferRequest"></param>
294 public void AddAssetRequest(IClientAPI userInfo, TransferRequestPacket transferRequest)
295 {
296 LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0);
297 //check to see if asset is in local cache, if not we need to request it from asset server.
298
299 if (!this.Assets.ContainsKey(requestID))
300 {
301 //not found asset
302 // so request from asset server
303 if (!this.RequestedAssets.ContainsKey(requestID))
304 {
305 AssetRequest request = new AssetRequest();
306 request.RequestUser = userInfo;
307 request.RequestAssetID = requestID;
308 request.TransferRequestID = transferRequest.TransferInfo.TransferID;
309 this.RequestedAssets.Add(requestID, request);
310 this._assetServer.RequestAsset(requestID, false);
311 }
312 return;
313 }
314 //it is in our cache
315 AssetInfo asset = this.Assets[requestID];
316
317 //work out how many packets it should be sent in
318 // and add to the AssetRequests list
319 AssetRequest req = new AssetRequest();
320 req.RequestUser = userInfo;
321 req.RequestAssetID = requestID;
322 req.TransferRequestID = transferRequest.TransferInfo.TransferID;
323 req.AssetInf = asset;
324
325 if (asset.Data.LongLength > 600)
326 {
327 //over 600 bytes so split up file
328 req.NumPackets = 1 + (int)(asset.Data.Length - 600 + 999) / 1000;
329 }
330 else
331 {
332 req.NumPackets = 1;
333 }
334
335 this.AssetRequests.Add(req);
336 }
337
338 /// <summary>
339 ///
340 /// </summary>
341 private void ProcessAssetQueue()
342 {
343 if (this.AssetRequests.Count == 0)
344 {
345 //no requests waiting
346 return;
347 }
348 int num;
349
350 if (this.AssetRequests.Count < 5)
351 {
352 //lower than 5 so do all of them
353 num = this.AssetRequests.Count;
354 }
355 else
356 {
357 num = 5;
358 }
359 AssetRequest req;
360 for (int i = 0; i < num; i++)
361 {
362 req = (AssetRequest)this.AssetRequests[i];
363
364 TransferInfoPacket Transfer = new TransferInfoPacket();
365 Transfer.TransferInfo.ChannelType = 2;
366 Transfer.TransferInfo.Status = 0;
367 Transfer.TransferInfo.TargetType = 0;
368 Transfer.TransferInfo.Params = req.RequestAssetID.GetBytes();
369 Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length;
370 Transfer.TransferInfo.TransferID = req.TransferRequestID;
371 req.RequestUser.OutPacket(Transfer);
372
373 if (req.NumPackets == 1)
374 {
375 TransferPacketPacket TransferPacket = new TransferPacketPacket();
376 TransferPacket.TransferData.Packet = 0;
377 TransferPacket.TransferData.ChannelType = 2;
378 TransferPacket.TransferData.TransferID = req.TransferRequestID;
379 TransferPacket.TransferData.Data = req.AssetInf.Data;
380 TransferPacket.TransferData.Status = 1;
381 req.RequestUser.OutPacket(TransferPacket);
382 }
383 else
384 {
385 //more than one packet so split file up , for now it can't be bigger than 2000 bytes
386 TransferPacketPacket TransferPacket = new TransferPacketPacket();
387 TransferPacket.TransferData.Packet = 0;
388 TransferPacket.TransferData.ChannelType = 2;
389 TransferPacket.TransferData.TransferID = req.TransferRequestID;
390 byte[] chunk = new byte[1000];
391 Array.Copy(req.AssetInf.Data, chunk, 1000);
392 TransferPacket.TransferData.Data = chunk;
393 TransferPacket.TransferData.Status = 0;
394 req.RequestUser.OutPacket(TransferPacket);
395
396 TransferPacket = new TransferPacketPacket();
397 TransferPacket.TransferData.Packet = 1;
398 TransferPacket.TransferData.ChannelType = 2;
399 TransferPacket.TransferData.TransferID = req.TransferRequestID;
400 byte[] chunk1 = new byte[(req.AssetInf.Data.Length - 1000)];
401 Array.Copy(req.AssetInf.Data, 1000, chunk1, 0, chunk1.Length);
402 TransferPacket.TransferData.Data = chunk1;
403 TransferPacket.TransferData.Status = 1;
404 req.RequestUser.OutPacket(TransferPacket);
405 }
406
407 }
408
409 //remove requests that have been completed
410 for (int i = 0; i < num; i++)
411 {
412 this.AssetRequests.RemoveAt(0);
413 }
414
415 }
416
417 public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset)
418 {
419 AssetInfo newAsset = new AssetInfo();
420 newAsset.Data = new byte[sourceAsset.Data.Length];
421 Array.Copy(sourceAsset.Data, newAsset.Data, sourceAsset.Data.Length);
422 newAsset.FullID = LLUUID.Random();
423 newAsset.Type = sourceAsset.Type;
424 newAsset.InvType = sourceAsset.InvType;
425 return (newAsset);
426 }
427 #endregion
428
429 #region Textures
430 /// <summary>
431 ///
432 /// </summary>
433 /// <param name="userInfo"></param>
434 /// <param name="imageID"></param>
435 public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID)
436 {
437 //Console.WriteLine("texture request for " + imageID.ToStringHyphenated());
438 //check to see if texture is in local cache, if not request from asset server
439 if (!this.Textures.ContainsKey(imageID))
440 {
441 if (!this.RequestedTextures.ContainsKey(imageID))
442 {
443 //not is cache so request from asset server
444 AssetRequest request = new AssetRequest();
445 request.RequestUser = userInfo;
446 request.RequestAssetID = imageID;
447 request.IsTextureRequest = true;
448 this.RequestedTextures.Add(imageID, request);
449 this._assetServer.RequestAsset(imageID, true);
450 }
451 return;
452 }
453
454 //Console.WriteLine("texture already in cache");
455 TextureImage imag = this.Textures[imageID];
456 AssetRequest req = new AssetRequest();
457 req.RequestUser = userInfo;
458 req.RequestAssetID = imageID;
459 req.IsTextureRequest = true;
460 req.ImageInfo = imag;
461
462 if (imag.Data.LongLength > 600)
463 {
464 //over 600 bytes so split up file
465 req.NumPackets = 1 + (int)(imag.Data.Length - 600 + 999) / 1000;
466 }
467 else
468 {
469 req.NumPackets = 1;
470 }
471 this.TextureRequests.Add(req);
472 }
473
474 public TextureImage CloneImage(LLUUID newOwner, TextureImage source)
475 {
476 TextureImage newImage = new TextureImage();
477 newImage.Data = new byte[source.Data.Length];
478 Array.Copy(source.Data, newImage.Data, source.Data.Length);
479 //newImage.filename = source.filename;
480 newImage.FullID = LLUUID.Random();
481 newImage.Name = source.Name;
482 return (newImage);
483 }
484 #endregion
485
486 private IAssetServer LoadAssetDll(string dllName)
487 {
488 Assembly pluginAssembly = Assembly.LoadFrom(dllName);
489 IAssetServer server = null;
490
491 foreach (Type pluginType in pluginAssembly.GetTypes())
492 {
493 if (pluginType.IsPublic)
494 {
495 if (!pluginType.IsAbstract)
496 {
497 Type typeInterface = pluginType.GetInterface("IAssetPlugin", true);
498
499 if (typeInterface != null)
500 {
501 IAssetPlugin plug = (IAssetPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
502 server = plug.GetAssetServer();
503 break;
504 }
505
506 typeInterface = null;
507 }
508 }
509 }
510 pluginAssembly = null;
511 return server;
512 }
513
514 public class AssetRequest
515 {
516 public IClientAPI RequestUser;
517 public LLUUID RequestAssetID;
518 public AssetInfo AssetInf;
519 public TextureImage ImageInfo;
520 public LLUUID TransferRequestID;
521 public long DataPointer = 0;
522 public int NumPackets = 0;
523 public int PacketCounter = 0;
524 public bool IsTextureRequest;
525 //public bool AssetInCache;
526 //public int TimeRequested;
527
528 public AssetRequest()
529 {
530
531 }
532 }
533
534 public class AssetInfo : AssetBase
535 {
536 public AssetInfo()
537 {
538
539 }
540
541 public AssetInfo(AssetBase aBase)
542 {
543 Data = aBase.Data;
544 FullID = aBase.FullID;
545 Type = aBase.Type;
546 InvType = aBase.InvType;
547 Name = aBase.Name;
548 Description = aBase.Description;
549 }
550 }
551
552 public class TextureImage : AssetBase
553 {
554 public TextureImage()
555 {
556
557 }
558
559 public TextureImage(AssetBase aBase)
560 {
561 Data = aBase.Data;
562 FullID = aBase.FullID;
563 Type = aBase.Type;
564 InvType = aBase.InvType;
565 Name = aBase.Name;
566 Description = aBase.Description;
567 }
568 }
569
570 public class TextureSender
571 {
572 public AssetRequest request;
573 public event DownloadComplete OnComplete;
574 Thread m_thread;
575 public TextureSender(AssetRequest req)
576 {
577 request = req;
578 //Console.WriteLine("creating worker thread for texture " + req.ImageInfo.FullID.ToStringHyphenated());
579 //Console.WriteLine("texture data length is " + req.ImageInfo.Data.Length);
580 // Console.WriteLine("in " + req.NumPackets + " packets");
581 //ThreadPool.QueueUserWorkItem(new WaitCallback(SendTexture), new object());
582
583 //need some sort of custom threadpool here, as using the .net one, overloads it and stops the handling of incoming packets etc
584 //but don't really want to create a thread for every texture download
585 m_thread = new Thread(new ThreadStart(SendTexture));
586 m_thread.IsBackground = true;
587 m_thread.Start();
588 }
589
590 public void SendTexture()
591 {
592 //Console.WriteLine("starting to send sending texture " + request.ImageInfo.FullID.ToStringHyphenated());
593 while (request.PacketCounter != request.NumPackets)
594 {
595 SendPacket();
596 Thread.Sleep(500);
597 }
598
599 //Console.WriteLine("finished sending texture " + request.ImageInfo.FullID.ToStringHyphenated());
600 if (OnComplete != null)
601 {
602 OnComplete(this);
603 }
604 }
605
606 public void SendPacket()
607 {
608 AssetRequest req = request;
609 // Console.WriteLine("sending " + req.ImageInfo.FullID);
610
611 // if (req.ImageInfo.FullID == new LLUUID("00000000-0000-0000-5005-000000000005"))
612 if (req.PacketCounter == 0)
613 {
614 //first time for this request so send imagedata packet
615 if (req.NumPackets == 1)
616 {
617 //only one packet so send whole file
618 ImageDataPacket im = new ImageDataPacket();
619 im.ImageID.Packets = 1;
620 im.ImageID.ID = req.ImageInfo.FullID;
621 im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
622 im.ImageData.Data = req.ImageInfo.Data;
623 im.ImageID.Codec = 2;
624 req.RequestUser.OutPacket(im);
625 req.PacketCounter++;
626 //req.ImageInfo.l= time;
627 //System.Console.WriteLine("sent texture: " + req.ImageInfo.FullID);
628 // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated());
629 }
630 else
631 {
632 //more than one packet so split file up
633 ImageDataPacket im = new ImageDataPacket();
634 im.ImageID.Packets = (ushort)req.NumPackets;
635 im.ImageID.ID = req.ImageInfo.FullID;
636 im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
637 im.ImageData.Data = new byte[600];
638 Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600);
639 im.ImageID.Codec = 2;
640 req.RequestUser.OutPacket(im);
641 req.PacketCounter++;
642 //req.ImageInfo.last_used = time;
643 //System.Console.WriteLine("sent first packet of texture:
644 // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated());
645 }
646 }
647 else
648 {
649 //Console.WriteLine("sending packet" + req.PacketCounter + "for " + req.ImageInfo.FullID.ToStringHyphenated());
650 //send imagepacket
651 //more than one packet so split file up
652 ImagePacketPacket im = new ImagePacketPacket();
653 im.ImageID.Packet = (ushort)req.PacketCounter;
654 im.ImageID.ID = req.ImageInfo.FullID;
655 int size = req.ImageInfo.Data.Length - 600 - 1000 * (req.PacketCounter - 1);
656 if (size > 1000) size = 1000;
657 im.ImageData.Data = new byte[size];
658 Array.Copy(req.ImageInfo.Data, 600 + 1000 * (req.PacketCounter - 1), im.ImageData.Data, 0, size);
659 req.RequestUser.OutPacket(im);
660 req.PacketCounter++;
661 //req.ImageInfo.last_used = time;
662 //System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID);
663 }
664
665 }
666 }
667 }
668}
669
diff --git a/OpenSim/Region/Caches/Properties/AssemblyInfo.cs b/OpenSim/Region/Caches/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8389415
--- /dev/null
+++ b/OpenSim/Region/Caches/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
1using System.Reflection;
2using System.Runtime.InteropServices;
3// General Information about an assembly is controlled through the following
4// set of attributes. Change these attribute values to modify the information
5// associated with an assembly.
6[assembly: AssemblyTitle("OpenSim.Region.Caches")]
7[assembly: AssemblyDescription("")]
8[assembly: AssemblyConfiguration("")]
9[assembly: AssemblyCompany("")]
10[assembly: AssemblyProduct("OpenSim.Region.Caches")]
11[assembly: AssemblyCopyright("Copyright © 2007")]
12[assembly: AssemblyTrademark("")]
13[assembly: AssemblyCulture("")]
14
15// Setting ComVisible to false makes the types in this assembly not visible
16// to COM components. If you need to access a type in this assembly from
17// COM, set the ComVisible attribute to true on that type.
18[assembly: ComVisible(false)]
19
20// The following GUID is for the ID of the typelib if this project is exposed to COM
21[assembly: Guid("2b15ddbf-0341-49a6-85c0-cece268a4518")]
22
23// Version information for an assembly consists of the following four values:
24//
25// Major Version
26// Minor Version
27// Build Number
28// Revision
29//
30// You can specify all the values or you can default the Revision and Build Numbers
31// by using the '*' as shown below:
32[assembly: AssemblyVersion("1.0.0.0")]
33[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Capabilities/Caps.cs b/OpenSim/Region/Capabilities/Caps.cs
new file mode 100644
index 0000000..6068076
--- /dev/null
+++ b/OpenSim/Region/Capabilities/Caps.cs
@@ -0,0 +1,336 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Text;
32using libsecondlife;
33using OpenSim.Framework.Servers;
34using OpenSim.Framework.Types;
35using OpenSim.Framework.Utilities;
36using OpenSim.Region.Caches;
37
38namespace OpenSim.Region.Capabilities
39{
40 public delegate void UpLoadedTexture(LLUUID assetID, LLUUID inventoryItem, byte[] data);
41
42 public class Caps
43 {
44 private string m_httpListenerHostName;
45 private int m_httpListenPort;
46 private string m_capsObjectPath = "00001-";
47 private string m_requestPath = "0000/";
48 private string m_mapLayerPath = "0001/";
49 private string m_newInventory = "0002/";
50 private string m_requestTexture = "0003/";
51 private string eventQueue = "0100/";
52 private BaseHttpServer httpListener;
53 private LLUUID agentID;
54 private AssetCache assetCache;
55 private int eventQueueCount = 1;
56 private Queue<string> CapsEventQueue = new Queue<string>();
57
58 public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, int httpPort, string capsPath, LLUUID agent)
59 {
60 assetCache = assetCach;
61 m_capsObjectPath = capsPath;
62 httpListener = httpServer;
63 m_httpListenerHostName = httpListen;
64 m_httpListenPort = httpPort;
65 agentID = agent;
66 }
67
68 /// <summary>
69 ///
70 /// </summary>
71 public void RegisterHandlers()
72 {
73 Console.WriteLine("registering CAPS handlers");
74 string capsBase = "/CAPS/" + m_capsObjectPath;
75
76
77 //AddLegacyCapsHandler( httpListener, m_mapLayerPath, MapLayer);
78
79 httpListener.AddStreamHandler(
80 new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST", capsBase + m_mapLayerPath, this.GetMapLayer ));
81
82 AddLegacyCapsHandler(httpListener, m_requestPath, CapsRequest);
83 AddLegacyCapsHandler(httpListener, m_newInventory, NewAgentInventory);
84 AddLegacyCapsHandler( httpListener, eventQueue, ProcessEventQueue);
85 AddLegacyCapsHandler( httpListener, m_requestTexture, RequestTexture);
86
87 }
88
89 [Obsolete("Use BaseHttpServer.AddStreamHandler(new LLSDStreamHandler( LLSDMethod delegate )) instead.")]
90 private void AddLegacyCapsHandler(BaseHttpServer httpListener, string path, RestMethod restMethod)
91 {
92 string capsBase = "/CAPS/" + m_capsObjectPath;
93 httpListener.AddStreamHandler(new RestStreamHandler("POST", capsBase + path, restMethod));
94 }
95
96 /// <summary>
97 ///
98 /// </summary>
99 /// <param name="request"></param>
100 /// <param name="path"></param>
101 /// <param name="param"></param>
102 /// <returns></returns>
103 public string CapsRequest(string request, string path, string param)
104 {
105 // Console.WriteLine("Caps Request " + request);
106 string result = "";
107 result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities());
108 return result;
109 }
110
111 /// <summary>
112 ///
113 /// </summary>
114 /// <returns></returns>
115 protected LLSDCapsDetails GetCapabilities()
116 {
117 LLSDCapsDetails caps = new LLSDCapsDetails();
118 string capsBaseUrl = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + m_capsObjectPath;
119
120 caps.MapLayer = capsBaseUrl + m_mapLayerPath;
121 // caps.NewFileAgentInventory = capsBaseUrl + m_newInventory;
122
123 return caps;
124 }
125
126 /// <summary>
127 ///
128 /// </summary>
129 /// <param name="request"></param>
130 /// <param name="path"></param>
131 /// <param name="param"></param>
132 /// <returns></returns>
133 public string MapLayer(string request, string path, string param)
134 {
135 Encoding _enc = Encoding.UTF8;
136 Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(_enc.GetBytes(request));
137 LLSDMapRequest mapReq = new LLSDMapRequest();
138 LLSDHelpers.DeserialiseLLSDMap(hash, mapReq);
139
140 LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
141 mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse());
142 string res = LLSDHelpers.SerialiseLLSDReply(mapResponse);
143
144 return res;
145 }
146
147 public LLSDMapLayerResponse GetMapLayer(LLSDMapRequest mapReq)
148 {
149 LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
150 mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse());
151 return mapResponse;
152 }
153
154
155 /// <summary>
156 ///
157 /// </summary>
158 /// <returns></returns>
159 protected LLSDMapLayer BuildLLSDMapLayerResponse()
160 {
161 LLSDMapLayer mapLayer = new LLSDMapLayer();
162 mapLayer.Right = 5000;
163 mapLayer.Top = 5000;
164 mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
165
166 return mapLayer;
167 }
168
169 /// <summary>
170 ///
171 /// </summary>
172 /// <param name="request"></param>
173 /// <param name="path"></param>
174 /// <param name="param"></param>
175 /// <returns></returns>
176 public string RequestTexture(string request, string path, string param)
177 {
178 // Needs implementing (added to remove compiler warning)
179 return "";
180 }
181
182 /// <summary>
183 ///
184 /// </summary>
185 /// <param name="request"></param>
186 /// <param name="path"></param>
187 /// <param name="param"></param>
188 /// <returns></returns>
189 public string ProcessEventQueue(string request, string path, string param)
190 {
191 string res = "";
192
193 if (this.CapsEventQueue.Count > 0)
194 {
195 lock (this.CapsEventQueue)
196 {
197 string item = CapsEventQueue.Dequeue();
198 res = item;
199 }
200 }
201 else
202 {
203 res = this.CreateEmptyEventResponse();
204 }
205 return res;
206 }
207
208 /// <summary>
209 ///
210 /// </summary>
211 /// <param name="caps"></param>
212 /// <param name="ipAddressPort"></param>
213 /// <returns></returns>
214 public string CreateEstablishAgentComms(string caps, string ipAddressPort)
215 {
216 LLSDCapEvent eventItem = new LLSDCapEvent();
217 eventItem.id = eventQueueCount;
218 //should be creating a EstablishAgentComms item, but there isn't a class for it yet
219 eventItem.events.Array.Add(new LLSDEmpty());
220 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
221 eventQueueCount++;
222
223 this.CapsEventQueue.Enqueue(res);
224 return res;
225 }
226
227 /// <summary>
228 ///
229 /// </summary>
230 /// <returns></returns>
231 public string CreateEmptyEventResponse()
232 {
233 LLSDCapEvent eventItem = new LLSDCapEvent();
234 eventItem.id = eventQueueCount;
235 eventItem.events.Array.Add(new LLSDEmpty());
236 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
237 eventQueueCount++;
238 return res;
239 }
240
241 /// <summary>
242 ///
243 /// </summary>
244 /// <param name="request"></param>
245 /// <param name="path"></param>
246 /// <param name="param"></param>
247 /// <returns></returns>
248 public string NewAgentInventory(string request, string path, string param)
249 {
250 //Console.WriteLine("received upload request:"+ request);
251 string res = "";
252 LLUUID newAsset = LLUUID.Random();
253 LLUUID newInvItem = LLUUID.Random();
254 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
255 AssetUploader uploader = new AssetUploader(newAsset, newInvItem, uploaderPath, this.httpListener);
256
257 AddLegacyCapsHandler( httpListener, uploaderPath, uploader.uploaderCaps);
258
259 string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + uploaderPath;
260 //Console.WriteLine("uploader url is " + uploaderURL);
261 res += "<llsd><map>";
262 res += "<key>uploader</key><string>" + uploaderURL + "</string>";
263 //res += "<key>success</key><boolean>true</boolean>";
264 res += "<key>state</key><string>upload</string>";
265 res += "</map></llsd>";
266 uploader.OnUpLoad += this.UploadHandler;
267 return res;
268 }
269
270 /// <summary>
271 ///
272 /// </summary>
273 /// <param name="assetID"></param>
274 /// <param name="inventoryItem"></param>
275 /// <param name="data"></param>
276 public void UploadHandler(LLUUID assetID, LLUUID inventoryItem, byte[] data)
277 {
278 // Console.WriteLine("upload handler called");
279 AssetBase asset;
280 asset = new AssetBase();
281 asset.FullID = assetID;
282 asset.Type = 0;
283 asset.InvType = 0;
284 asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000");
285 asset.Data = data;
286 this.assetCache.AddAsset(asset);
287 }
288
289 public class AssetUploader
290 {
291 public event UpLoadedTexture OnUpLoad;
292
293 private string uploaderPath = "";
294 private LLUUID newAssetID;
295 private LLUUID inventoryItemID;
296 private BaseHttpServer httpListener;
297 public AssetUploader(LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer)
298 {
299 newAssetID = assetID;
300 inventoryItemID = inventoryItem;
301 uploaderPath = path;
302 httpListener = httpServer;
303
304 }
305
306 public string uploaderCaps(string request, string path, string param)
307 {
308 Encoding _enc = Encoding.UTF8;
309 byte[] data = _enc.GetBytes(request);
310 //Console.WriteLine("recieved upload " + Util.FieldToString(data));
311 LLUUID inv = this.inventoryItemID;
312 string res = "";
313 res += "<llsd><map>";
314 res += "<key>new_asset</key><string>" + newAssetID.ToStringHyphenated() + "</string>";
315 res += "<key>new_inventory_item</key><uuid>" + inv.ToStringHyphenated() + "</uuid>";
316 res += "<key>state</key><string>complete</string>";
317 res += "</map></llsd>";
318
319 // Console.WriteLine("asset " + newAssetID.ToStringHyphenated() + " , inventory item " + inv.ToStringHyphenated());
320 httpListener.RemoveStreamHandler("POST", "/CAPS/" + uploaderPath);
321
322 if (OnUpLoad != null)
323 {
324 OnUpLoad(newAssetID, inv, data);
325 }
326
327 /*FileStream fs = File.Create("upload.jp2");
328 BinaryWriter bw = new BinaryWriter(fs);
329 bw.Write(data);
330 bw.Close();
331 fs.Close();*/
332 return res;
333 }
334 }
335 }
336}
diff --git a/OpenSim/Region/Capabilities/LLSDArray.cs b/OpenSim/Region/Capabilities/LLSDArray.cs
new file mode 100644
index 0000000..e04849f
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDArray.cs
@@ -0,0 +1,42 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Collections;
29
30namespace OpenSim.Region.Capabilities
31{
32 [LLSDType("ARRAY")]
33 public class LLSDArray
34 {
35 public ArrayList Array = new ArrayList();
36
37 public LLSDArray()
38 {
39
40 }
41 }
42}
diff --git a/OpenSim/Region/Capabilities/LLSDCapEvent.cs b/OpenSim/Region/Capabilities/LLSDCapEvent.cs
new file mode 100644
index 0000000..51b4fe0
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDCapEvent.cs
@@ -0,0 +1,41 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28namespace OpenSim.Region.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDCapEvent
32 {
33 public int id = 0;
34 public LLSDArray events = new LLSDArray();
35
36 public LLSDCapEvent()
37 {
38
39 }
40 }
41}
diff --git a/OpenSim/Region/Capabilities/LLSDCapsDetails.cs b/OpenSim/Region/Capabilities/LLSDCapsDetails.cs
new file mode 100644
index 0000000..1f8b242
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDCapsDetails.cs
@@ -0,0 +1,15 @@
1namespace OpenSim.Region.Capabilities
2{
3 [LLSDType("MAP")]
4 public class LLSDCapsDetails
5 {
6 public string MapLayer = "";
7 //public string NewFileAgentInventory = "";
8 //public string EventQueueGet = "";
9
10 public LLSDCapsDetails()
11 {
12
13 }
14 }
15}
diff --git a/OpenSim/Region/Capabilities/LLSDEmpty.cs b/OpenSim/Region/Capabilities/LLSDEmpty.cs
new file mode 100644
index 0000000..d79c09e
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDEmpty.cs
@@ -0,0 +1,38 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28namespace OpenSim.Region.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDEmpty
32 {
33 public LLSDEmpty()
34 {
35
36 }
37 }
38}
diff --git a/OpenSim/Region/Capabilities/LLSDHelpers.cs b/OpenSim/Region/Capabilities/LLSDHelpers.cs
new file mode 100644
index 0000000..19ef0c9
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDHelpers.cs
@@ -0,0 +1,164 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections;
30using System.IO;
31using System.Reflection;
32using System.Xml;
33using libsecondlife;
34
35namespace OpenSim.Region.Capabilities
36{
37 public class LLSDHelpers
38 {
39 public static string SerialiseLLSDReply(object obj)
40 {
41 StringWriter sw = new StringWriter();
42 XmlTextWriter writer = new XmlTextWriter(sw);
43 writer.Formatting = Formatting.None;
44 writer.WriteStartElement(String.Empty, "llsd", String.Empty);
45 SerializeLLSDType(writer, obj);
46 writer.WriteEndElement();
47 writer.Close();
48 return sw.ToString();
49 }
50
51 public static void SerializeLLSDType(XmlTextWriter writer, object obj)
52 {
53 Type myType = obj.GetType();
54 LLSDType[] llsdattributes = (LLSDType[])myType.GetCustomAttributes(typeof(LLSDType), false);
55 if (llsdattributes.Length > 0)
56 {
57 switch (llsdattributes[0].ObjectType)
58 {
59 case "MAP":
60 writer.WriteStartElement(String.Empty, "map", String.Empty);
61 FieldInfo[] fields = myType.GetFields();
62 for (int i = 0; i < fields.Length; i++)
63 {
64 object fieldValue = fields[i].GetValue(obj);
65 LLSDType[] fieldAttributes = (LLSDType[])fieldValue.GetType().GetCustomAttributes(typeof(LLSDType), false);
66 if (fieldAttributes.Length > 0)
67 {
68 writer.WriteStartElement(String.Empty, "key", String.Empty);
69 writer.WriteString(fields[i].Name);
70 writer.WriteEndElement();
71 SerializeLLSDType(writer, fieldValue);
72 }
73 else
74 {
75 writer.WriteStartElement(String.Empty, "key", String.Empty);
76 writer.WriteString(fields[i].Name);
77 writer.WriteEndElement();
78 LLSD.LLSDWriteOne(writer, fieldValue);
79 }
80 }
81 writer.WriteEndElement();
82 break;
83 case "ARRAY":
84 // LLSDArray arrayObject = obj as LLSDArray;
85 // ArrayList a = arrayObject.Array;
86 ArrayList a = (ArrayList)obj.GetType().GetField("Array").GetValue(obj);
87 if (a != null)
88 {
89 writer.WriteStartElement(String.Empty, "array", String.Empty);
90 foreach (object item in a)
91 {
92 SerializeLLSDType(writer, item);
93 }
94 writer.WriteEndElement();
95 }
96 break;
97 }
98 }
99 else
100 {
101 LLSD.LLSDWriteOne(writer, obj);
102 }
103 }
104
105 public static object DeserialiseLLSDMap(Hashtable llsd, object obj)
106 {
107 Type myType = obj.GetType();
108 LLSDType[] llsdattributes = (LLSDType[])myType.GetCustomAttributes(typeof(LLSDType), false);
109 if (llsdattributes.Length > 0)
110 {
111 switch (llsdattributes[0].ObjectType)
112 {
113 case "MAP":
114 IDictionaryEnumerator enumerator = llsd.GetEnumerator();
115 while (enumerator.MoveNext())
116 {
117 FieldInfo field = myType.GetField((string)enumerator.Key);
118 if (field != null)
119 {
120 if (enumerator.Value is Hashtable)
121 {
122 object fieldValue = field.GetValue(obj);
123 DeserialiseLLSDMap((Hashtable) enumerator.Value, fieldValue);
124 }
125 else if (enumerator.Value is ArrayList)
126 {
127 object fieldValue = field.GetValue(obj);
128 fieldValue.GetType().GetField("Array").SetValue(fieldValue, enumerator.Value);
129 //TODO
130 // the LLSD map/array types in the array need to be deserialised
131 // but first we need to know the right class to deserialise them into.
132 }
133 else
134 {
135 field.SetValue(obj, enumerator.Value);
136 }
137 }
138 }
139 break;
140 }
141 }
142 return obj;
143 }
144 }
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164}
diff --git a/OpenSim/Region/Capabilities/LLSDMapLayer.cs b/OpenSim/Region/Capabilities/LLSDMapLayer.cs
new file mode 100644
index 0000000..566d0e9
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDMapLayer.cs
@@ -0,0 +1,46 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using libsecondlife;
29
30namespace OpenSim.Region.Capabilities
31{
32 [LLSDType("MAP")]
33 public class LLSDMapLayer
34 {
35 public int Left = 0;
36 public int Right = 0;
37 public int Top = 0;
38 public int Bottom = 0;
39 public LLUUID ImageID = LLUUID.Zero;
40
41 public LLSDMapLayer()
42 {
43
44 }
45 }
46}
diff --git a/OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs b/OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs
new file mode 100644
index 0000000..ce746ae
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs
@@ -0,0 +1,41 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28namespace OpenSim.Region.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDMapLayerResponse
32 {
33 public LLSDMapRequest AgentData = new LLSDMapRequest();
34 public LLSDArray LayerData = new LLSDArray();
35
36 public LLSDMapLayerResponse()
37 {
38
39 }
40 }
41}
diff --git a/OpenSim/Region/Capabilities/LLSDMapRequest.cs b/OpenSim/Region/Capabilities/LLSDMapRequest.cs
new file mode 100644
index 0000000..fb739cd
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDMapRequest.cs
@@ -0,0 +1,13 @@
1namespace OpenSim.Region.Capabilities
2{
3 [LLSDType("MAP")]
4 public class LLSDMapRequest
5 {
6 public int Flags = 0;
7
8 public LLSDMapRequest()
9 {
10
11 }
12 }
13}
diff --git a/OpenSim/Region/Capabilities/LLSDMethod.cs b/OpenSim/Region/Capabilities/LLSDMethod.cs
new file mode 100644
index 0000000..5f42f44
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDMethod.cs
@@ -0,0 +1,8 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Region.Capabilities
6{
7 public delegate TResponse LLSDMethod<TRequest, TResponse>(TRequest request);
8}
diff --git a/OpenSim/Region/Capabilities/LLSDStreamHandler.cs b/OpenSim/Region/Capabilities/LLSDStreamHandler.cs
new file mode 100644
index 0000000..7d99b6e
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDStreamHandler.cs
@@ -0,0 +1,42 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenSim.Framework.Servers;
5using System.IO;
6using System.Collections;
7using libsecondlife;
8
9namespace OpenSim.Region.Capabilities
10{
11 public class LLSDStreamhandler<TRequest, TResponse> : BaseStreamHandler
12 where TRequest : new()
13 {
14 private LLSDMethod<TRequest, TResponse> m_method;
15
16 public LLSDStreamhandler(string httpMethod, string path, LLSDMethod<TRequest, TResponse> method)
17 : base(httpMethod, path )
18 {
19 m_method = method;
20 }
21
22 public override byte[] Handle(string path, Stream request)
23 {
24 //Encoding encoding = Encoding.UTF8;
25 //StreamReader streamReader = new StreamReader(request, false);
26
27 //string requestBody = streamReader.ReadToEnd();
28 //streamReader.Close();
29
30 Hashtable hash = (Hashtable)LLSD.LLSDDeserialize( request );
31 TRequest llsdRequest = new TRequest();
32 LLSDHelpers.DeserialiseLLSDMap(hash, llsdRequest);
33
34 TResponse response = m_method(llsdRequest);
35
36 Encoding encoding = new UTF8Encoding(false);
37
38 return encoding.GetBytes( LLSDHelpers.SerialiseLLSDReply(response) );
39
40 }
41 }
42}
diff --git a/OpenSim/Region/Capabilities/LLSDTest.cs b/OpenSim/Region/Capabilities/LLSDTest.cs
new file mode 100644
index 0000000..f23e327
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDTest.cs
@@ -0,0 +1,41 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28namespace OpenSim.Region.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDTest
32 {
33 public int Test1 = 20;
34 public int Test2 = 10;
35
36 public LLSDTest()
37 {
38
39 }
40 }
41}
diff --git a/OpenSim/Region/Capabilities/LLSDType.cs b/OpenSim/Region/Capabilities/LLSDType.cs
new file mode 100644
index 0000000..c58a937
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDType.cs
@@ -0,0 +1,59 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29
30namespace OpenSim.Region.Capabilities
31{
32 [AttributeUsage(AttributeTargets.Class)]
33 public class LLSDType : Attribute
34 {
35 protected string myType;
36
37 public LLSDType(string type)
38 {
39 myType = type;
40
41 }
42
43 public string ObjectType
44 {
45 get
46 {
47 return myType;
48 }
49 }
50 }
51
52 [AttributeUsage(AttributeTargets.Class)]
53 public class LLSDMap : LLSDType
54 {
55 public LLSDMap() : base( "MAP" )
56 {
57 }
58 }
59}
diff --git a/OpenSim/Region/Capabilities/LLSDUploadReply.cs b/OpenSim/Region/Capabilities/LLSDUploadReply.cs
new file mode 100644
index 0000000..023a056
--- /dev/null
+++ b/OpenSim/Region/Capabilities/LLSDUploadReply.cs
@@ -0,0 +1,44 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using libsecondlife;
29
30namespace OpenSim.Region.Capabilities
31{
32 [LLSDType("MAP")]
33 public class LLSDUploadReply
34 {
35 public string new_asset = "";
36 public LLUUID new_inventory_item = LLUUID.Zero;
37 public string state = "";
38
39 public LLSDUploadReply()
40 {
41
42 }
43 }
44}
diff --git a/OpenSim/Region/ClientStack/Assets/InventoryCache.cs b/OpenSim/Region/ClientStack/Assets/InventoryCache.cs
new file mode 100644
index 0000000..082c0d0
--- /dev/null
+++ b/OpenSim/Region/ClientStack/Assets/InventoryCache.cs
@@ -0,0 +1,337 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28
29using System;
30using System.Collections.Generic;
31using System.Text;
32using libsecondlife;
33using libsecondlife.Packets;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Inventory;
36using OpenSim.Framework.Types;
37using OpenSim.Region.ClientStack;
38
39namespace OpenSim.Assets
40{
41 /// <summary>
42 /// Description of InventoryManager.
43 /// </summary>
44 public class InventoryCache
45 {
46 private Dictionary<LLUUID, AgentInventory> _agentsInventory;
47 private List<UserServerRequest> _serverRequests; //list of requests made to user server.
48 private Encoding _enc = Encoding.ASCII;
49 private const uint FULL_MASK_PERMISSIONS = 2147483647;
50
51 public InventoryCache()
52 {
53 _agentsInventory = new Dictionary<LLUUID, AgentInventory>();
54 _serverRequests = new List<UserServerRequest>();
55 }
56
57 public void AddNewAgentsInventory(AgentInventory agentInventory)
58 {
59 if (!this._agentsInventory.ContainsKey(agentInventory.AgentID))
60 {
61 this._agentsInventory.Add(agentInventory.AgentID, agentInventory);
62 }
63 }
64
65 public AgentInventory FetchAgentsInventory(LLUUID agentID, IUserServer userserver)
66 {
67 AgentInventory res = null;
68 if (!this._agentsInventory.ContainsKey(agentID))
69 {
70 res = userserver.RequestAgentsInventory(agentID);
71 this._agentsInventory.Add(agentID,res);
72 }
73 return res;
74 }
75
76 public AgentInventory GetAgentsInventory(LLUUID agentID)
77 {
78 if (this._agentsInventory.ContainsKey(agentID))
79 {
80 return this._agentsInventory[agentID];
81 }
82
83 return null;
84 }
85
86 public void ClientLeaving(LLUUID clientID, IUserServer userserver)
87 {
88 if (this._agentsInventory.ContainsKey(clientID))
89 {
90 if (userserver != null)
91 {
92 userserver.UpdateAgentsInventory(clientID, this._agentsInventory[clientID]);
93 }
94 this._agentsInventory.Remove(clientID);
95 }
96 }
97
98 public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID)
99 {
100 return this.CreateNewInventoryFolder(remoteClient, folderID, 0);
101 }
102
103 public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type)
104 {
105 bool res = false;
106 if (folderID != LLUUID.Zero) //don't create a folder with a zero id
107 {
108 if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
109 {
110 res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID, type);
111 }
112 }
113 return res;
114 }
115
116 public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type, string folderName, LLUUID parent)
117 {
118 bool res = false;
119 if (folderID != LLUUID.Zero) //don't create a folder with a zero id
120 {
121 if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
122 {
123 res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID, type, folderName, parent);
124 }
125 }
126 return res;
127 }
128
129 public LLUUID AddNewInventoryItem(ClientView remoteClient, LLUUID folderID, AssetBase asset)
130 {
131 LLUUID newItem = null;
132 if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
133 {
134 newItem = this._agentsInventory[remoteClient.AgentID].AddToInventory(folderID, asset);
135 if (newItem != null)
136 {
137 InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[newItem];
138 this.SendItemUpdateCreate(remoteClient, Item);
139 }
140 }
141
142 return newItem;
143 }
144 public bool DeleteInventoryItem(ClientView remoteClient, LLUUID itemID)
145 {
146 bool res = false;
147 if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
148 {
149 res = this._agentsInventory[remoteClient.AgentID].DeleteFromInventory(itemID);
150 if (res)
151 {
152 RemoveInventoryItemPacket remove = new RemoveInventoryItemPacket();
153 remove.AgentData.AgentID = remoteClient.AgentID;
154 remove.AgentData.SessionID = remoteClient.SessionID;
155 remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
156 remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock();
157 remove.InventoryData[0].ItemID = itemID;
158 remoteClient.OutPacket(remove);
159 }
160 }
161
162 return res;
163 }
164
165 public bool UpdateInventoryItemAsset(ClientView remoteClient, LLUUID itemID, AssetBase asset)
166 {
167 if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
168 {
169 bool res = _agentsInventory[remoteClient.AgentID].UpdateItemAsset(itemID, asset);
170 if (res)
171 {
172 InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[itemID];
173 this.SendItemUpdateCreate(remoteClient, Item);
174 }
175 return res;
176 }
177
178 return false;
179 }
180
181 public bool UpdateInventoryItemDetails(ClientView remoteClient, LLUUID itemID, UpdateInventoryItemPacket.InventoryDataBlock packet)
182 {
183 if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
184 {
185 bool res = _agentsInventory[remoteClient.AgentID].UpdateItemDetails(itemID, packet);
186 if (res)
187 {
188 InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[itemID];
189 this.SendItemUpdateCreate(remoteClient, Item);
190 }
191 return res;
192 }
193
194 return false;
195 }
196
197 public void FetchInventoryDescendents(ClientView userInfo, FetchInventoryDescendentsPacket FetchDescend)
198 {
199 if (this._agentsInventory.ContainsKey(userInfo.AgentID))
200 {
201 AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
202 if (FetchDescend.InventoryData.FetchItems)
203 {
204 if (agentInventory.InventoryFolders.ContainsKey(FetchDescend.InventoryData.FolderID))
205 {
206 InventoryFolder Folder = agentInventory.InventoryFolders[FetchDescend.InventoryData.FolderID];
207 InventoryDescendentsPacket Descend = new InventoryDescendentsPacket();
208 Descend.AgentData.AgentID = userInfo.AgentID;
209 Descend.AgentData.OwnerID = Folder.OwnerID;
210 Descend.AgentData.FolderID = FetchDescend.InventoryData.FolderID;
211 Descend.AgentData.Descendents = Folder.Items.Count;
212 Descend.AgentData.Version = Folder.Items.Count;
213
214
215 Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count];
216 for (int i = 0; i < Folder.Items.Count; i++)
217 {
218
219 InventoryItem Item = Folder.Items[i];
220 Descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock();
221 Descend.ItemData[i].ItemID = Item.ItemID;
222 Descend.ItemData[i].AssetID = Item.AssetID;
223 Descend.ItemData[i].CreatorID = Item.CreatorID;
224 Descend.ItemData[i].BaseMask = FULL_MASK_PERMISSIONS;
225 Descend.ItemData[i].CreationDate = 1000;
226 Descend.ItemData[i].Description = _enc.GetBytes(Item.Description + "\0");
227 Descend.ItemData[i].EveryoneMask = FULL_MASK_PERMISSIONS;
228 Descend.ItemData[i].Flags = 1;
229 Descend.ItemData[i].FolderID = Item.FolderID;
230 Descend.ItemData[i].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
231 Descend.ItemData[i].GroupMask = FULL_MASK_PERMISSIONS;
232 Descend.ItemData[i].InvType = Item.InvType;
233 Descend.ItemData[i].Name = _enc.GetBytes(Item.Name + "\0");
234 Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS;
235 Descend.ItemData[i].OwnerID = Item.OwnerID;
236 Descend.ItemData[i].OwnerMask = FULL_MASK_PERMISSIONS;
237 Descend.ItemData[i].SalePrice = 100;
238 Descend.ItemData[i].SaleType = 0;
239 Descend.ItemData[i].Type = Item.Type;
240 Descend.ItemData[i].CRC = 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);
241 }
242
243 userInfo.OutPacket(Descend);
244
245 }
246 }
247 else
248 {
249 Console.WriteLine("fetch subfolders");
250 }
251 }
252 }
253
254 public void FetchInventory(ClientView userInfo, FetchInventoryPacket FetchItems)
255 {
256 if (this._agentsInventory.ContainsKey(userInfo.AgentID))
257 {
258 AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
259
260 for (int i = 0; i < FetchItems.InventoryData.Length; i++)
261 {
262 if (agentInventory.InventoryItems.ContainsKey(FetchItems.InventoryData[i].ItemID))
263 {
264 InventoryItem Item = agentInventory.InventoryItems[FetchItems.InventoryData[i].ItemID];
265 FetchInventoryReplyPacket InventoryReply = new FetchInventoryReplyPacket();
266 InventoryReply.AgentData.AgentID = userInfo.AgentID;
267 InventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
268 InventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
269 InventoryReply.InventoryData[0].ItemID = Item.ItemID;
270 InventoryReply.InventoryData[0].AssetID = Item.AssetID;
271 InventoryReply.InventoryData[0].CreatorID = Item.CreatorID;
272 InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS;
273 InventoryReply.InventoryData[0].CreationDate = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
274 InventoryReply.InventoryData[0].Description = _enc.GetBytes(Item.Description + "\0");
275 InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS;
276 InventoryReply.InventoryData[0].Flags = 0;
277 InventoryReply.InventoryData[0].FolderID = Item.FolderID;
278 InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
279 InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS;
280 InventoryReply.InventoryData[0].InvType = Item.InvType;
281 InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name + "\0");
282 InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS;
283 InventoryReply.InventoryData[0].OwnerID = Item.OwnerID;
284 InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS;
285 InventoryReply.InventoryData[0].SalePrice = 100;
286 InventoryReply.InventoryData[0].SaleType = 0;
287 InventoryReply.InventoryData[0].Type = Item.Type;
288 InventoryReply.InventoryData[0].CRC = 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);
289 userInfo.OutPacket(InventoryReply);
290 }
291 }
292 }
293 }
294
295 private void SendItemUpdateCreate(ClientView remoteClient, InventoryItem Item)
296 {
297
298 UpdateCreateInventoryItemPacket InventoryReply = new UpdateCreateInventoryItemPacket();
299 InventoryReply.AgentData.AgentID = remoteClient.AgentID;
300 InventoryReply.AgentData.SimApproved = true;
301 InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
302 InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock();
303 InventoryReply.InventoryData[0].ItemID = Item.ItemID;
304 InventoryReply.InventoryData[0].AssetID = Item.AssetID;
305 InventoryReply.InventoryData[0].CreatorID = Item.CreatorID;
306 InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS;
307 InventoryReply.InventoryData[0].CreationDate = 1000;
308 InventoryReply.InventoryData[0].Description = _enc.GetBytes(Item.Description + "\0");
309 InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS;
310 InventoryReply.InventoryData[0].Flags = 0;
311 InventoryReply.InventoryData[0].FolderID = Item.FolderID;
312 InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
313 InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS;
314 InventoryReply.InventoryData[0].InvType = Item.InvType;
315 InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name + "\0");
316 InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS;
317 InventoryReply.InventoryData[0].OwnerID = Item.OwnerID;
318 InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS;
319 InventoryReply.InventoryData[0].SalePrice = 100;
320 InventoryReply.InventoryData[0].SaleType = 0;
321 InventoryReply.InventoryData[0].Type = Item.Type;
322 InventoryReply.InventoryData[0].CRC = 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);
323
324 remoteClient.OutPacket(InventoryReply);
325 }
326 }
327
328
329
330 public class UserServerRequest
331 {
332 public UserServerRequest()
333 {
334
335 }
336 }
337}
diff --git a/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs b/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs
new file mode 100644
index 0000000..f4e537c
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs
@@ -0,0 +1,40 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Net.Sockets;
29
30namespace OpenSim.Region.ClientStack
31{
32
33 public interface ClientStackNetworkHandler
34 {
35 void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode);// EndPoint packetSender);
36 void RemoveClientCircuit(uint circuitcode);
37 void RegisterPacketServer(PacketServer server);
38 }
39
40}
diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs
new file mode 100644
index 0000000..225e906
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.API.cs
@@ -0,0 +1,1122 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Net;
31using System.Text;
32using Axiom.Math;
33using libsecondlife;
34using libsecondlife.Packets;
35using OpenSim.Framework.Console;
36using OpenSim.Framework.Interfaces;
37using OpenSim.Framework.Types;
38
39namespace OpenSim.Region.ClientStack
40{
41 partial class ClientView
42 {
43 public event ImprovedInstantMessage OnInstantMessage;
44 public event ChatFromViewer OnChatFromViewer;
45 public event RezObject OnRezObject;
46 public event GenericCall4 OnDeRezObject;
47 public event ModifyTerrain OnModifyTerrain;
48 public event GenericCall OnRegionHandShakeReply;
49 public event GenericCall OnRequestWearables;
50 public event SetAppearance OnSetAppearance;
51 public event GenericCall2 OnCompleteMovementToRegion;
52 public event UpdateAgent OnAgentUpdate;
53 public event StartAnim OnStartAnim;
54 public event GenericCall OnRequestAvatarsData;
55 public event LinkObjects OnLinkObjects;
56 public event UpdateVector OnGrapObject;
57 public event ObjectSelect OnDeGrapObject;
58 public event ObjectDuplicate OnObjectDuplicate;
59 public event MoveObject OnGrapUpdate;
60 public event GenericCall4 OnAddPrim;
61 public event UpdateShape OnUpdatePrimShape;
62 public event ObjectSelect OnObjectSelect;
63 public event GenericCall7 OnObjectDescription;
64 public event GenericCall7 OnObjectName;
65 public event UpdatePrimFlags OnUpdatePrimFlags;
66 public event UpdatePrimTexture OnUpdatePrimTexture;
67 public event UpdateVector OnUpdatePrimGroupPosition;
68 public event UpdateVector OnUpdatePrimSinglePosition;
69 public event UpdatePrimRotation OnUpdatePrimGroupRotation;
70 public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
71 public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
72 public event UpdateVector OnUpdatePrimScale;
73 public event StatusChange OnChildAgentStatus;
74 public event GenericCall2 OnStopMovement;
75 public event NewAvatar OnNewAvatar;
76 public event GenericCall6 OnRemoveAvatar;
77 public event RequestMapBlocks OnRequestMapBlocks;
78 public event TeleportLocationRequest OnTeleportLocationRequest;
79
80 public event UUIDNameRequest OnNameFromUUIDRequest;
81
82 public event ParcelPropertiesRequest OnParcelPropertiesRequest;
83 public event ParcelDivideRequest OnParcelDivideRequest;
84 public event ParcelJoinRequest OnParcelJoinRequest;
85 public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
86
87 public event EstateOwnerMessageRequest OnEstateOwnerMessage;
88 /// <summary>
89 ///
90 /// </summary>
91 public LLVector3 StartPos
92 {
93 get
94 {
95 return startpos;
96 }
97 set
98 {
99 startpos = value;
100 }
101 }
102
103 /// <summary>
104 ///
105 /// </summary>
106 public LLUUID AgentId
107 {
108 get
109 {
110 return this.AgentID;
111 }
112 }
113
114 /// <summary>
115 ///
116 /// </summary>
117 public string FirstName
118 {
119 get
120 {
121 return this.firstName;
122 }
123
124 }
125
126 /// <summary>
127 ///
128 /// </summary>
129 public string LastName
130 {
131 get
132 {
133 return this.lastName;
134 }
135 }
136
137 #region World/Avatar to Client
138
139 /// <summary>
140 ///
141 /// </summary>
142 /// <param name="regionInfo"></param>
143 public void SendRegionHandshake(RegionInfo regionInfo)
144 {
145 Encoding _enc = Encoding.ASCII;
146 RegionHandshakePacket handshake = new RegionHandshakePacket();
147
148 handshake.RegionInfo.BillableFactor = regionInfo.estateSettings.billableFactor;
149 handshake.RegionInfo.IsEstateManager = false;
150 handshake.RegionInfo.TerrainHeightRange00 = regionInfo.estateSettings.terrainHeightRange0;
151 handshake.RegionInfo.TerrainHeightRange01 = regionInfo.estateSettings.terrainHeightRange1;
152 handshake.RegionInfo.TerrainHeightRange10 = regionInfo.estateSettings.terrainHeightRange2;
153 handshake.RegionInfo.TerrainHeightRange11 = regionInfo.estateSettings.terrainHeightRange3;
154 handshake.RegionInfo.TerrainStartHeight00 = regionInfo.estateSettings.terrainStartHeight0;
155 handshake.RegionInfo.TerrainStartHeight01 = regionInfo.estateSettings.terrainStartHeight1;
156 handshake.RegionInfo.TerrainStartHeight10 = regionInfo.estateSettings.terrainStartHeight2;
157 handshake.RegionInfo.TerrainStartHeight11 = regionInfo.estateSettings.terrainStartHeight3;
158 handshake.RegionInfo.SimAccess = (byte)regionInfo.estateSettings.simAccess;
159 handshake.RegionInfo.WaterHeight = regionInfo.estateSettings.waterHeight;
160
161
162 handshake.RegionInfo.RegionFlags = (uint)regionInfo.estateSettings.regionFlags;
163
164 handshake.RegionInfo.SimName = _enc.GetBytes(regionInfo.RegionName + "\0");
165 handshake.RegionInfo.SimOwner = regionInfo.MasterAvatarAssignedUUID;
166 handshake.RegionInfo.TerrainBase0 = regionInfo.estateSettings.terrainBase0;
167 handshake.RegionInfo.TerrainBase1 = regionInfo.estateSettings.terrainBase1;
168 handshake.RegionInfo.TerrainBase2 = regionInfo.estateSettings.terrainBase2;
169 handshake.RegionInfo.TerrainBase3 = regionInfo.estateSettings.terrainBase3;
170 handshake.RegionInfo.TerrainDetail0 = regionInfo.estateSettings.terrainDetail0;
171 handshake.RegionInfo.TerrainDetail1 = regionInfo.estateSettings.terrainDetail1;
172 handshake.RegionInfo.TerrainDetail2 = regionInfo.estateSettings.terrainDetail2;
173 handshake.RegionInfo.TerrainDetail3 = regionInfo.estateSettings.terrainDetail3;
174 handshake.RegionInfo.CacheID = LLUUID.Random(); //I guess this is for the client to remember an old setting?
175
176 this.OutPacket(handshake);
177 }
178
179 /// <summary>
180 ///
181 /// </summary>
182 /// <param name="regInfo"></param>
183 public void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look)
184 {
185 AgentMovementCompletePacket mov = new AgentMovementCompletePacket();
186 mov.AgentData.SessionID = this.SessionID;
187 mov.AgentData.AgentID = this.AgentID;
188 mov.Data.RegionHandle = regInfo.RegionHandle;
189 mov.Data.Timestamp = 1172750370; // TODO - dynamicalise this
190
191 if ((pos.X == 0) && (pos.Y == 0) && (pos.Z == 0))
192 {
193 mov.Data.Position = this.startpos;
194 }
195 else
196 {
197 mov.Data.Position = pos;
198 }
199 mov.Data.LookAt = look;
200
201 OutPacket(mov);
202 }
203
204 /// <summary>
205 ///
206 /// </summary>
207 /// <param name="message"></param>
208 /// <param name="type"></param>
209 /// <param name="fromPos"></param>
210 /// <param name="fromName"></param>
211 /// <param name="fromAgentID"></param>
212 public void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
213 {
214 SendChatMessage(Helpers.StringToField(message), type, fromPos, fromName, fromAgentID);
215 }
216
217 /// <summary>
218 ///
219 /// </summary>
220 /// <param name="message"></param>
221 /// <param name="type"></param>
222 /// <param name="fromPos"></param>
223 /// <param name="fromName"></param>
224 /// <param name="fromAgentID"></param>
225 public void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
226 {
227 Encoding enc = Encoding.ASCII;
228 ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket();
229 reply.ChatData.Audible = 1;
230 reply.ChatData.Message = message;
231 reply.ChatData.ChatType = type;
232 reply.ChatData.SourceType = 1;
233 reply.ChatData.Position = fromPos;
234 reply.ChatData.FromName = enc.GetBytes(fromName + "\0");
235 reply.ChatData.OwnerID = fromAgentID;
236 reply.ChatData.SourceID = fromAgentID;
237
238 this.OutPacket(reply);
239 }
240
241 /// <summary>
242 ///
243 /// </summary>
244 /// <remarks>TODO</remarks>
245 /// <param name="message"></param>
246 /// <param name="target"></param>
247 public void SendInstantMessage(string message, LLUUID target)
248 {
249 ImprovedInstantMessagePacket msg = new ImprovedInstantMessagePacket();
250 msg.AgentData.AgentID = this.AgentID;
251 msg.AgentData.SessionID = this.SessionID;
252
253 msg.MessageBlock.Dialog = 0;
254 msg.MessageBlock.FromGroup = false;
255 msg.MessageBlock.ID = target.Combine(this.AgentID);
256 msg.MessageBlock.Offline = 0;
257 msg.MessageBlock.ParentEstateID = 0;
258 msg.MessageBlock.Position = new LLVector3();
259 msg.MessageBlock.RegionID = new LLUUID();
260 msg.MessageBlock.Timestamp = 0;
261 msg.MessageBlock.ToAgentID = target;
262
263 this.OutPacket(msg);
264 }
265
266 /// <summary>
267 /// Send the region heightmap to the client
268 /// </summary>
269 /// <param name="map">heightmap</param>
270 public virtual void SendLayerData(float[] map)
271 {
272 try
273 {
274 int[] patches = new int[4];
275
276 for (int y = 0; y < 16; y++)
277 {
278 for (int x = 0; x < 16; x = x + 4)
279 {
280 patches[0] = x + 0 + y * 16;
281 patches[1] = x + 1 + y * 16;
282 patches[2] = x + 2 + y * 16;
283 patches[3] = x + 3 + y * 16;
284
285 Packet layerpack = TerrainManager.CreateLandPacket(map, patches);
286 OutPacket(layerpack);
287 }
288 }
289 }
290 catch (Exception e)
291 {
292 MainLog.Instance.Warn("ClientView API.cs: SendLayerData() - Failed with exception " + e.ToString());
293 }
294 }
295
296 /// <summary>
297 /// Sends a specified patch to a client
298 /// </summary>
299 /// <param name="px">Patch coordinate (x) 0..16</param>
300 /// <param name="py">Patch coordinate (y) 0..16</param>
301 /// <param name="map">heightmap</param>
302 public void SendLayerData(int px, int py, float[] map)
303 {
304 try
305 {
306 int[] patches = new int[1];
307 int patchx, patchy;
308 patchx = px / 16;
309 patchy = py / 16;
310
311 patches[0] = patchx + 0 + patchy * 16;
312
313 Packet layerpack = TerrainManager.CreateLandPacket(map, patches);
314 OutPacket(layerpack);
315 }
316 catch (Exception e)
317 {
318 MainLog.Instance.Warn("ClientView API .cs: SendLayerData() - Failed with exception " + e.ToString());
319 }
320 }
321
322 /// <summary>
323 ///
324 /// </summary>
325 /// <param name="neighbourHandle"></param>
326 /// <param name="neighbourIP"></param>
327 /// <param name="neighbourPort"></param>
328 public void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourEndPoint )
329 {
330 IPAddress neighbourIP = neighbourEndPoint.Address;
331 ushort neighbourPort = (ushort) neighbourEndPoint.Port;
332
333 EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket();
334 enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
335 enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
336
337 byte[] byteIP = neighbourIP.GetAddressBytes();
338 enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
339 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
340 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
341 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
342 enablesimpacket.SimulatorInfo.Port = neighbourPort;
343 OutPacket(enablesimpacket);
344 }
345
346 /// <summary>
347 ///
348 /// </summary>
349 /// <returns></returns>
350 public AgentCircuitData RequestClientInfo()
351 {
352 AgentCircuitData agentData = new AgentCircuitData();
353 agentData.AgentID = this.AgentId;
354 agentData.SessionID = this.SessionID;
355 agentData.SecureSessionID = this.SecureSessionID;
356 agentData.circuitcode = this.CircuitCode;
357 agentData.child = false;
358 agentData.firstname = this.firstName;
359 agentData.lastname = this.lastName;
360
361 return agentData;
362 }
363
364 public void CrossRegion(ulong newRegionHandle, LLVector3 pos, LLVector3 lookAt, IPEndPoint externalIPEndPoint)
365 {
366 LLVector3 look = new LLVector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10);
367
368 CrossedRegionPacket newSimPack = new CrossedRegionPacket();
369 newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
370 newSimPack.AgentData.AgentID = this.AgentID;
371 newSimPack.AgentData.SessionID = this.SessionID;
372 newSimPack.Info = new CrossedRegionPacket.InfoBlock();
373 newSimPack.Info.Position = pos;
374 newSimPack.Info.LookAt = look; // new LLVector3(0.0f, 0.0f, 0.0f); // copied from Avatar.cs - SHOULD BE DYNAMIC!!!!!!!!!!
375 newSimPack.RegionData = new CrossedRegionPacket.RegionDataBlock();
376 newSimPack.RegionData.RegionHandle = newRegionHandle;
377 byte[] byteIP = externalIPEndPoint.Address.GetAddressBytes();
378 newSimPack.RegionData.SimIP = (uint)byteIP[3] << 24;
379 newSimPack.RegionData.SimIP += (uint)byteIP[2] << 16;
380 newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8;
381 newSimPack.RegionData.SimIP += (uint)byteIP[0];
382 newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port;
383 newSimPack.RegionData.SeedCapability = new byte[0];
384
385 this.OutPacket(newSimPack);
386 //this.DowngradeClient();
387 }
388
389 public void SendMapBlock(List<MapBlockData> mapBlocks)
390 {
391 Encoding _enc = Encoding.ASCII;
392
393 MapBlockReplyPacket mapReply = new MapBlockReplyPacket();
394 mapReply.AgentData.AgentID = this.AgentID;
395 mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks.Count];
396 mapReply.AgentData.Flags = 0;
397
398 for (int i = 0; i < mapBlocks.Count; i++)
399 {
400 mapReply.Data[i] = new MapBlockReplyPacket.DataBlock();
401 mapReply.Data[i].MapImageID = mapBlocks[i].MapImageId;
402 mapReply.Data[i].X = mapBlocks[i].X;
403 mapReply.Data[i].Y = mapBlocks[i].Y;
404 mapReply.Data[i].WaterHeight = mapBlocks[i].WaterHeight;
405 mapReply.Data[i].Name = _enc.GetBytes(mapBlocks[i].Name);
406 mapReply.Data[i].RegionFlags = mapBlocks[i].RegionFlags;
407 mapReply.Data[i].Access = mapBlocks[i].Access;
408 mapReply.Data[i].Agents = mapBlocks[i].Agents;
409 }
410 this.OutPacket(mapReply);
411 }
412
413 public void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags)
414 {
415 TeleportLocalPacket tpLocal = new TeleportLocalPacket();
416 tpLocal.Info.AgentID = this.AgentID;
417 tpLocal.Info.TeleportFlags = flags;
418 tpLocal.Info.LocationID = 2;
419 tpLocal.Info.LookAt = lookAt;
420 tpLocal.Info.Position = position;
421 OutPacket(tpLocal);
422 }
423
424 public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID, uint flags)
425 {
426 TeleportFinishPacket teleport = new TeleportFinishPacket();
427 teleport.Info.AgentID = this.AgentID;
428 teleport.Info.RegionHandle = regionHandle;
429 teleport.Info.SimAccess = simAccess;
430 teleport.Info.SeedCapability = new byte[0];
431
432 IPAddress oIP = newRegionEndPoint.Address;
433 byte[] byteIP = oIP.GetAddressBytes();
434 uint ip = (uint)byteIP[3] << 24;
435 ip += (uint)byteIP[2] << 16;
436 ip += (uint)byteIP[1] << 8;
437 ip += (uint)byteIP[0];
438
439 teleport.Info.SimIP = ip;
440 teleport.Info.SimPort = (ushort)newRegionEndPoint.Port;
441 teleport.Info.LocationID = 4;
442 teleport.Info.TeleportFlags = 1 << 4;
443 OutPacket(teleport);
444 }
445
446 /// <summary>
447 ///
448 /// </summary>
449 public void SendTeleportCancel()
450 {
451 TeleportCancelPacket tpCancel = new TeleportCancelPacket();
452 tpCancel.Info.SessionID = this.SessionID;
453 tpCancel.Info.AgentID = this.AgentID;
454
455 OutPacket(tpCancel);
456 }
457
458 /// <summary>
459 ///
460 /// </summary>
461 public void SendTeleportLocationStart()
462 {
463 TeleportStartPacket tpStart = new TeleportStartPacket();
464 tpStart.Info.TeleportFlags = 16; // Teleport via location
465 OutPacket(tpStart);
466 }
467
468 public void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance)
469 {
470 MoneyBalanceReplyPacket money = new MoneyBalanceReplyPacket();
471 money.MoneyData.AgentID = this.AgentID;
472 money.MoneyData.TransactionID = transaction;
473 money.MoneyData.TransactionSuccess = success;
474 money.MoneyData.Description = description;
475 money.MoneyData.MoneyBalance = balance;
476 OutPacket(money);
477 }
478
479 public void SendStartPingCheck(byte seq)
480 {
481 StartPingCheckPacket pc = new StartPingCheckPacket();
482 pc.PingID.PingID = seq;
483 OutPacket(pc);
484 }
485
486 public void SendKillObject(ulong regionHandle, uint avatarLocalID)
487 {
488 KillObjectPacket kill = new KillObjectPacket();
489 kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
490 kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
491 kill.ObjectData[0].ID = avatarLocalID;
492 OutPacket(kill);
493 }
494
495
496 #region Appearance/ Wearables Methods
497
498 /// <summary>
499 ///
500 /// </summary>
501 /// <param name="wearables"></param>
502 public void SendWearables(AvatarWearable[] wearables)
503 {
504 AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket();
505 aw.AgentData.AgentID = this.AgentID;
506 aw.AgentData.SerialNum = 0;
507 aw.AgentData.SessionID = this.SessionID;
508
509 aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
510 AgentWearablesUpdatePacket.WearableDataBlock awb;
511 for (int i = 0; i < wearables.Length; i++)
512 {
513 awb = new AgentWearablesUpdatePacket.WearableDataBlock();
514 awb.WearableType = (byte)i;
515 awb.AssetID = wearables[i].AssetID;
516 awb.ItemID = wearables[i].ItemID;
517 aw.WearableData[i] = awb;
518 }
519
520 this.OutPacket(aw);
521 }
522
523 /// <summary>
524 ///
525 /// </summary>
526 /// <param name="agentID"></param>
527 /// <param name="visualParams"></param>
528 /// <param name="textureEntry"></param>
529 public void SendAppearance(LLUUID agentID, byte[] visualParams, byte[] textureEntry)
530 {
531 AvatarAppearancePacket avp = new AvatarAppearancePacket();
532 avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
533 avp.ObjectData.TextureEntry = textureEntry;
534
535 AvatarAppearancePacket.VisualParamBlock avblock = null;
536 for (int i = 0; i < visualParams.Length; i++)
537 {
538 avblock = new AvatarAppearancePacket.VisualParamBlock();
539 avblock.ParamValue = visualParams[i];
540 avp.VisualParam[i] = avblock;
541 }
542
543 avp.Sender.IsTrial = false;
544 avp.Sender.ID = agentID;
545 OutPacket(avp);
546 }
547
548 public void SendAnimation(LLUUID animID, int seq, LLUUID sourceAgentId)
549 {
550 AvatarAnimationPacket ani = new AvatarAnimationPacket();
551 ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1];
552 ani.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock();
553 ani.AnimationSourceList[0].ObjectID = sourceAgentId;
554 ani.Sender = new AvatarAnimationPacket.SenderBlock();
555 ani.Sender.ID = sourceAgentId;
556 ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[1];
557 ani.AnimationList[0] = new AvatarAnimationPacket.AnimationListBlock();
558 ani.AnimationList[0].AnimID = animID;
559 ani.AnimationList[0].AnimSequenceID = seq;
560 this.OutPacket(ani);
561 }
562
563 #endregion
564
565 #region Avatar Packet/data sending Methods
566
567 /// <summary>
568 ///
569 /// </summary>
570 /// <param name="regionInfo"></param>
571 /// <param name="firstName"></param>
572 /// <param name="lastName"></param>
573 /// <param name="avatarID"></param>
574 /// <param name="avatarLocalID"></param>
575 /// <param name="Pos"></param>
576 public void SendAvatarData(ulong regionHandle, string firstName, string lastName, LLUUID avatarID, uint avatarLocalID, LLVector3 Pos, byte[] textureEntry)
577 {
578 Encoding _enc = Encoding.ASCII;
579 //send a objectupdate packet with information about the clients avatar
580
581 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
582 objupdate.RegionData.RegionHandle = regionHandle;
583 objupdate.RegionData.TimeDilation = 64096;
584 objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
585 objupdate.ObjectData[0] = this.CreateDefaultAvatarPacket(textureEntry);
586 //give this avatar object a local id and assign the user a name
587
588 objupdate.ObjectData[0].ID = avatarLocalID;
589 objupdate.ObjectData[0].FullID = avatarID;
590 objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstName + "\nLastName STRING RW SV " + lastName + " \0");
591 LLVector3 pos2 = new LLVector3((float)Pos.X, (float)Pos.Y, (float)Pos.Z);
592 byte[] pb = pos2.GetBytes();
593 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
594
595 OutPacket(objupdate);
596
597 }
598
599 /// <summary>
600 ///
601 /// </summary>
602 /// <param name="regionHandle"></param>
603 /// <param name="timeDilation"></param>
604 /// <param name="localID"></param>
605 /// <param name="position"></param>
606 /// <param name="velocity"></param>
607 public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLVector3 velocity)
608 {
609 ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = this.CreateAvatarImprovedBlock(localID, position, velocity);
610 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
611 terse.RegionData.RegionHandle = regionHandle;
612 terse.RegionData.TimeDilation = timeDilation;
613 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
614 terse.ObjectData[0] = terseBlock;
615
616 this.OutPacket(terse);
617 }
618
619 #endregion
620
621 #region Primitive Packet/data Sending Methods
622
623 /// <summary>
624 ///
625 /// </summary>
626 /// <param name="localID"></param>
627 /// <param name="rotation"></param>
628 /// <param name="attachPoint"></param>
629 public void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint)
630 {
631 ObjectAttachPacket attach = new ObjectAttachPacket();
632 attach.AgentData.AgentID = this.AgentID;
633 attach.AgentData.SessionID = this.SessionID;
634 attach.AgentData.AttachmentPoint = attachPoint;
635 attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1];
636 attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock();
637 attach.ObjectData[0].ObjectLocalID = localID;
638 attach.ObjectData[0].Rotation = rotation;
639
640 this.OutPacket(attach);
641 }
642
643 /// <summary>
644 /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
645 /// or big changes to a existing primitive.
646 /// </summary>
647 /// <param name="regionHandle"></param>
648 /// <param name="timeDilation"></param>
649 /// <param name="localID"></param>
650 /// <param name="primData"></param>
651 /// <param name="pos"></param>
652 /// <param name="rotation"></param>
653 /// <param name="textureID"></param>
654 public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags)
655 {
656 ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
657 outPacket.RegionData.RegionHandle = regionHandle;
658 outPacket.RegionData.TimeDilation = timeDilation;
659 outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
660 outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
661 outPacket.ObjectData[0].ID = localID;
662 outPacket.ObjectData[0].FullID = primData.FullID;
663 byte[] pb = pos.GetBytes();
664 Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
665 byte[] rot = rotation.GetBytes();
666 Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 48, rot.Length);
667 OutPacket(outPacket);
668 }
669
670 /// <summary>
671 /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
672 /// or big changes to a existing primitive.
673 /// Uses default rotation
674 /// </summary>
675 /// <param name="primData"></param>
676 /// <param name="pos"></param>
677 public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID , uint flags)
678 {
679 ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
680 outPacket.RegionData.RegionHandle = regionHandle;
681 outPacket.RegionData.TimeDilation = timeDilation;
682 outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
683 outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
684 outPacket.ObjectData[0].ID = localID;
685 outPacket.ObjectData[0].FullID = primData.FullID;
686 byte[] pb = pos.GetBytes();
687 Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
688
689 OutPacket(outPacket);
690 }
691
692
693 public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID)
694 {
695 ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
696 outPacket.RegionData.RegionHandle = regionHandle;
697 outPacket.RegionData.TimeDilation = timeDilation;
698 outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
699 outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primShape, textureID, flags);
700 outPacket.ObjectData[0].ID = localID;
701 outPacket.ObjectData[0].FullID = objectID;
702 outPacket.ObjectData[0].OwnerID = ownerID;
703 outPacket.ObjectData[0].Text = enc.GetBytes(text);
704 outPacket.ObjectData[0].ParentID = parentID;
705 byte[] pb = pos.GetBytes();
706 Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
707 byte[] rot = rotation.GetBytes();
708 Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 36, rot.Length);
709 OutPacket(outPacket);
710 }
711
712 public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLUUID textureID, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID)
713 {
714 ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
715 outPacket.RegionData.RegionHandle = regionHandle;
716 outPacket.RegionData.TimeDilation = timeDilation;
717 outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
718 outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primShape, textureID, flags);
719 outPacket.ObjectData[0].ID = localID;
720 outPacket.ObjectData[0].FullID = objectID;
721 outPacket.ObjectData[0].OwnerID = ownerID;
722 outPacket.ObjectData[0].Text = enc.GetBytes(text);
723 outPacket.ObjectData[0].ParentID = parentID;
724 byte[] pb = pos.GetBytes();
725 Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
726
727 OutPacket(outPacket);
728 }
729 /// <summary>
730 ///
731 /// </summary>
732 /// <param name="regionHandle"></param>
733 /// <param name="timeDilation"></param>
734 /// <param name="localID"></param>
735 /// <param name="position"></param>
736 /// <param name="rotation"></param>
737 public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLQuaternion rotation)
738 {
739 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
740 terse.RegionData.RegionHandle = regionHandle;
741 terse.RegionData.TimeDilation = timeDilation;
742 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
743 terse.ObjectData[0] = this.CreatePrimImprovedBlock(localID, position, rotation);
744
745 this.OutPacket(terse);
746 }
747
748 #endregion
749
750 #endregion
751
752 #region Helper Methods
753
754 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateAvatarImprovedBlock(uint localID, LLVector3 pos, LLVector3 velocity)
755 {
756 byte[] bytes = new byte[60];
757 int i = 0;
758 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
759
760 dat.TextureEntry = new byte[0];// AvatarTemplate.TextureEntry;
761
762 uint ID = localID;
763
764 bytes[i++] = (byte)(ID % 256);
765 bytes[i++] = (byte)((ID >> 8) % 256);
766 bytes[i++] = (byte)((ID >> 16) % 256);
767 bytes[i++] = (byte)((ID >> 24) % 256);
768 bytes[i++] = 0;
769 bytes[i++] = 1;
770 i += 14;
771 bytes[i++] = 128;
772 bytes[i++] = 63;
773
774 byte[] pb = pos.GetBytes();
775 Array.Copy(pb, 0, bytes, i, pb.Length);
776 i += 12;
777 ushort InternVelocityX;
778 ushort InternVelocityY;
779 ushort InternVelocityZ;
780 Vector3 internDirec = new Vector3(0, 0, 0);
781
782 internDirec = new Vector3(velocity.X, velocity.Y, velocity.Z);
783
784 internDirec = internDirec / 128.0f;
785 internDirec.x += 1;
786 internDirec.y += 1;
787 internDirec.z += 1;
788
789 InternVelocityX = (ushort)(32768 * internDirec.x);
790 InternVelocityY = (ushort)(32768 * internDirec.y);
791 InternVelocityZ = (ushort)(32768 * internDirec.z);
792
793 ushort ac = 32767;
794 bytes[i++] = (byte)(InternVelocityX % 256);
795 bytes[i++] = (byte)((InternVelocityX >> 8) % 256);
796 bytes[i++] = (byte)(InternVelocityY % 256);
797 bytes[i++] = (byte)((InternVelocityY >> 8) % 256);
798 bytes[i++] = (byte)(InternVelocityZ % 256);
799 bytes[i++] = (byte)((InternVelocityZ >> 8) % 256);
800
801 //accel
802 bytes[i++] = (byte)(ac % 256);
803 bytes[i++] = (byte)((ac >> 8) % 256);
804 bytes[i++] = (byte)(ac % 256);
805 bytes[i++] = (byte)((ac >> 8) % 256);
806 bytes[i++] = (byte)(ac % 256);
807 bytes[i++] = (byte)((ac >> 8) % 256);
808
809 //rot
810 bytes[i++] = (byte)(ac % 256);
811 bytes[i++] = (byte)((ac >> 8) % 256);
812 bytes[i++] = (byte)(ac % 256);
813 bytes[i++] = (byte)((ac >> 8) % 256);
814 bytes[i++] = (byte)(ac % 256);
815 bytes[i++] = (byte)((ac >> 8) % 256);
816 bytes[i++] = (byte)(ac % 256);
817 bytes[i++] = (byte)((ac >> 8) % 256);
818
819 //rotation vel
820 bytes[i++] = (byte)(ac % 256);
821 bytes[i++] = (byte)((ac >> 8) % 256);
822 bytes[i++] = (byte)(ac % 256);
823 bytes[i++] = (byte)((ac >> 8) % 256);
824 bytes[i++] = (byte)(ac % 256);
825 bytes[i++] = (byte)((ac >> 8) % 256);
826
827 dat.Data = bytes;
828 return (dat);
829 }
830
831 /// <summary>
832 ///
833 /// </summary>
834 /// <param name="localID"></param>
835 /// <param name="position"></param>
836 /// <param name="rotation"></param>
837 /// <returns></returns>
838 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID, LLVector3 position, LLQuaternion rotation)
839 {
840 uint ID = localID;
841 byte[] bytes = new byte[60];
842
843 int i = 0;
844 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
845 dat.TextureEntry = new byte[0];
846 bytes[i++] = (byte)(ID % 256);
847 bytes[i++] = (byte)((ID >> 8) % 256);
848 bytes[i++] = (byte)((ID >> 16) % 256);
849 bytes[i++] = (byte)((ID >> 24) % 256);
850 bytes[i++] = 0;
851 bytes[i++] = 0;
852
853 byte[] pb = position.GetBytes();
854 Array.Copy(pb, 0, bytes, i, pb.Length);
855 i += 12;
856 ushort ac = 32767;
857
858 //vel
859 bytes[i++] = (byte)(ac % 256);
860 bytes[i++] = (byte)((ac >> 8) % 256);
861 bytes[i++] = (byte)(ac % 256);
862 bytes[i++] = (byte)((ac >> 8) % 256);
863 bytes[i++] = (byte)(ac % 256);
864 bytes[i++] = (byte)((ac >> 8) % 256);
865
866 //accel
867 bytes[i++] = (byte)(ac % 256);
868 bytes[i++] = (byte)((ac >> 8) % 256);
869 bytes[i++] = (byte)(ac % 256);
870 bytes[i++] = (byte)((ac >> 8) % 256);
871 bytes[i++] = (byte)(ac % 256);
872 bytes[i++] = (byte)((ac >> 8) % 256);
873
874 ushort rw, rx, ry, rz;
875 rw = (ushort)(32768 * (rotation.W + 1));
876 rx = (ushort)(32768 * (rotation.X + 1));
877 ry = (ushort)(32768 * (rotation.Y + 1));
878 rz = (ushort)(32768 * (rotation.Z + 1));
879
880 //rot
881 bytes[i++] = (byte)(rx % 256);
882 bytes[i++] = (byte)((rx >> 8) % 256);
883 bytes[i++] = (byte)(ry % 256);
884 bytes[i++] = (byte)((ry >> 8) % 256);
885 bytes[i++] = (byte)(rz % 256);
886 bytes[i++] = (byte)((rz >> 8) % 256);
887 bytes[i++] = (byte)(rw % 256);
888 bytes[i++] = (byte)((rw >> 8) % 256);
889
890 //rotation vel
891 bytes[i++] = (byte)(ac % 256);
892 bytes[i++] = (byte)((ac >> 8) % 256);
893 bytes[i++] = (byte)(ac % 256);
894 bytes[i++] = (byte)((ac >> 8) % 256);
895 bytes[i++] = (byte)(ac % 256);
896 bytes[i++] = (byte)((ac >> 8) % 256);
897
898 dat.Data = bytes;
899 return dat;
900 }
901
902
903 /// <summary>
904 /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
905 /// </summary>
906 /// <param name="primData"></param>
907 /// <returns></returns>
908 protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimData primData, LLUUID textureID, uint flags)
909 {
910 ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock();
911 this.SetDefaultPrimPacketValues(objupdate);
912 objupdate.UpdateFlags = flags;
913 this.SetPrimPacketShapeData(objupdate, primData, textureID);
914
915 return objupdate;
916 }
917
918 /// <summary>
919 /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
920 /// </summary>
921 /// <param name="primData"></param>
922 /// <returns></returns>
923 protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimitiveBaseShape primShape, LLUUID textureID, uint flags)
924 {
925 ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock();
926 this.SetDefaultPrimPacketValues(objupdate);
927 objupdate.UpdateFlags = flags;
928 this.SetPrimPacketShapeData(objupdate, primShape, textureID);
929
930 return objupdate;
931 }
932
933
934 /// <summary>
935 /// Copy the data from a PrimData object to a ObjectUpdatePacket
936 /// </summary>
937 /// <param name="objectData"></param>
938 /// <param name="primData"></param>
939 protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimData primData, LLUUID textureID)
940 {
941 LLObject.TextureEntry ntex = new LLObject.TextureEntry(textureID);
942 objectData.TextureEntry = ntex.ToBytes();
943 objectData.OwnerID = primData.OwnerID;
944 objectData.ParentID = primData.ParentID;
945 objectData.PCode = primData.PCode;
946 objectData.PathBegin = primData.PathBegin;
947 objectData.PathEnd = primData.PathEnd;
948 objectData.PathScaleX = primData.PathScaleX;
949 objectData.PathScaleY = primData.PathScaleY;
950 objectData.PathShearX = primData.PathShearX;
951 objectData.PathShearY = primData.PathShearY;
952 objectData.PathSkew = primData.PathSkew;
953 objectData.ProfileBegin = primData.ProfileBegin;
954 objectData.ProfileEnd = primData.ProfileEnd;
955 objectData.Scale = primData.Scale;
956 objectData.PathCurve = primData.PathCurve;
957 objectData.ProfileCurve = primData.ProfileCurve;
958 objectData.ProfileHollow = primData.ProfileHollow;
959 objectData.PathRadiusOffset = primData.PathRadiusOffset;
960 objectData.PathRevolutions = primData.PathRevolutions;
961 objectData.PathTaperX = primData.PathTaperX;
962 objectData.PathTaperY = primData.PathTaperY;
963 objectData.PathTwist = primData.PathTwist;
964 objectData.PathTwistBegin = primData.PathTwistBegin;
965 }
966
967 protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimitiveBaseShape primData, LLUUID textureID)
968 {
969 LLObject.TextureEntry ntex = new LLObject.TextureEntry(textureID);
970 objectData.TextureEntry = ntex.ToBytes();
971 objectData.PCode = primData.PCode;
972 objectData.PathBegin = primData.PathBegin;
973 objectData.PathEnd = primData.PathEnd;
974 objectData.PathScaleX = primData.PathScaleX;
975 objectData.PathScaleY = primData.PathScaleY;
976 objectData.PathShearX = primData.PathShearX;
977 objectData.PathShearY = primData.PathShearY;
978 objectData.PathSkew = primData.PathSkew;
979 objectData.ProfileBegin = primData.ProfileBegin;
980 objectData.ProfileEnd = primData.ProfileEnd;
981 objectData.Scale = primData.Scale;
982 objectData.PathCurve = primData.PathCurve;
983 objectData.ProfileCurve = primData.ProfileCurve;
984 objectData.ProfileHollow = primData.ProfileHollow;
985 objectData.PathRadiusOffset = primData.PathRadiusOffset;
986 objectData.PathRevolutions = primData.PathRevolutions;
987 objectData.PathTaperX = primData.PathTaperX;
988 objectData.PathTaperY = primData.PathTaperY;
989 objectData.PathTwist = primData.PathTwist;
990 objectData.PathTwistBegin = primData.PathTwistBegin;
991 }
992
993 /// <summary>
994 /// Set some default values in a ObjectUpdatePacket
995 /// </summary>
996 /// <param name="objdata"></param>
997 protected void SetDefaultPrimPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata)
998 {
999 objdata.PSBlock = new byte[0];
1000 objdata.ExtraParams = new byte[1];
1001 objdata.MediaURL = new byte[0];
1002 objdata.NameValue = new byte[0];
1003 objdata.Text = new byte[0];
1004 objdata.TextColor = new byte[4];
1005 objdata.JointAxisOrAnchor = new LLVector3(0, 0, 0);
1006 objdata.JointPivot = new LLVector3(0, 0, 0);
1007 objdata.Material = 3;
1008 objdata.TextureAnim = new byte[0];
1009 objdata.Sound = LLUUID.Zero;
1010 objdata.State = 0;
1011 objdata.Data = new byte[0];
1012
1013 objdata.ObjectData = new byte[60];
1014 objdata.ObjectData[46] = 128;
1015 objdata.ObjectData[47] = 63;
1016 }
1017
1018
1019 /// <summary>
1020 ///
1021 /// </summary>
1022 /// <returns></returns>
1023 protected ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry)
1024 {
1025 ObjectUpdatePacket.ObjectDataBlock objdata = new ObjectUpdatePacket.ObjectDataBlock(); // new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
1026
1027 SetDefaultAvatarPacketValues(ref objdata);
1028 objdata.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24);
1029 objdata.PathCurve = 16;
1030 objdata.ProfileCurve = 1;
1031 objdata.PathScaleX = 100;
1032 objdata.PathScaleY = 100;
1033 objdata.ParentID = 0;
1034 objdata.OwnerID = LLUUID.Zero;
1035 objdata.Scale = new LLVector3(1, 1, 1);
1036 objdata.PCode = 47;
1037 if (textureEntry != null)
1038 {
1039 objdata.TextureEntry = textureEntry;
1040 }
1041 Encoding enc = Encoding.ASCII;
1042 LLVector3 pos = new LLVector3(objdata.ObjectData, 16);
1043 pos.X = 100f;
1044 objdata.ID = 8880000;
1045 objdata.NameValue = enc.GetBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User \0");
1046 LLVector3 pos2 = new LLVector3(100f, 100f, 23f);
1047 //objdata.FullID=user.AgentID;
1048 byte[] pb = pos.GetBytes();
1049 Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length);
1050
1051 return objdata;
1052 }
1053
1054 /// <summary>
1055 ///
1056 /// </summary>
1057 /// <param name="objdata"></param>
1058 protected void SetDefaultAvatarPacketValues(ref ObjectUpdatePacket.ObjectDataBlock objdata)
1059 {
1060 objdata.PSBlock = new byte[0];
1061 objdata.ExtraParams = new byte[1];
1062 objdata.MediaURL = new byte[0];
1063 objdata.NameValue = new byte[0];
1064 objdata.Text = new byte[0];
1065 objdata.TextColor = new byte[4];
1066 objdata.JointAxisOrAnchor = new LLVector3(0, 0, 0);
1067 objdata.JointPivot = new LLVector3(0, 0, 0);
1068 objdata.Material = 4;
1069 objdata.TextureAnim = new byte[0];
1070 objdata.Sound = LLUUID.Zero;
1071 LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
1072 objdata.TextureEntry = ntex.ToBytes();
1073 objdata.State = 0;
1074 objdata.Data = new byte[0];
1075
1076 objdata.ObjectData = new byte[76];
1077 objdata.ObjectData[15] = 128;
1078 objdata.ObjectData[16] = 63;
1079 objdata.ObjectData[56] = 128;
1080 objdata.ObjectData[61] = 102;
1081 objdata.ObjectData[62] = 40;
1082 objdata.ObjectData[63] = 61;
1083 objdata.ObjectData[64] = 189;
1084 }
1085
1086 /// <summary>
1087 ///
1088 /// </summary>
1089 /// <param name="addPacket"></param>
1090 /// <returns></returns>
1091 protected PrimData CreatePrimFromObjectAdd(ObjectAddPacket addPacket)
1092 {
1093 PrimData PData = new PrimData();
1094 PData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
1095 PData.PCode = addPacket.ObjectData.PCode;
1096 PData.PathBegin = addPacket.ObjectData.PathBegin;
1097 PData.PathEnd = addPacket.ObjectData.PathEnd;
1098 PData.PathScaleX = addPacket.ObjectData.PathScaleX;
1099 PData.PathScaleY = addPacket.ObjectData.PathScaleY;
1100 PData.PathShearX = addPacket.ObjectData.PathShearX;
1101 PData.PathShearY = addPacket.ObjectData.PathShearY;
1102 PData.PathSkew = addPacket.ObjectData.PathSkew;
1103 PData.ProfileBegin = addPacket.ObjectData.ProfileBegin;
1104 PData.ProfileEnd = addPacket.ObjectData.ProfileEnd;
1105 PData.Scale = addPacket.ObjectData.Scale;
1106 PData.PathCurve = addPacket.ObjectData.PathCurve;
1107 PData.ProfileCurve = addPacket.ObjectData.ProfileCurve;
1108 PData.ParentID = 0;
1109 PData.ProfileHollow = addPacket.ObjectData.ProfileHollow;
1110 PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
1111 PData.PathRevolutions = addPacket.ObjectData.PathRevolutions;
1112 PData.PathTaperX = addPacket.ObjectData.PathTaperX;
1113 PData.PathTaperY = addPacket.ObjectData.PathTaperY;
1114 PData.PathTwist = addPacket.ObjectData.PathTwist;
1115 PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
1116
1117 return PData;
1118 }
1119 #endregion
1120
1121 }
1122}
diff --git a/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs b/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs
new file mode 100644
index 0000000..60cd33a
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs
@@ -0,0 +1,357 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using libsecondlife;
31using libsecondlife.Packets;
32using OpenSim.Assets;
33using OpenSim.Framework.Interfaces;
34using OpenSim.Framework.Types;
35using OpenSim.Framework.Utilities;
36using OpenSim.Region.Caches;
37
38namespace OpenSim.Region.ClientStack
39{
40 partial class ClientView
41 {
42 public class AgentAssetUpload
43 {
44 private Dictionary<LLUUID, AssetTransaction> transactions = new Dictionary<LLUUID, AssetTransaction>();
45 private ClientView ourClient;
46 private AssetCache m_assetCache;
47 private InventoryCache m_inventoryCache;
48
49 public AgentAssetUpload(ClientView client, AssetCache assetCache, InventoryCache inventoryCache)
50 {
51 this.ourClient = client;
52 m_assetCache = assetCache;
53 m_inventoryCache = inventoryCache;
54 }
55
56 public void AddUpload(LLUUID transactionID, AssetBase asset)
57 {
58 AssetTransaction upload = new AssetTransaction();
59 lock (this.transactions)
60 {
61 upload.Asset = asset;
62 upload.TransactionID = transactionID;
63 this.transactions.Add(transactionID, upload);
64 }
65 if (upload.Asset.Data.Length > 2)
66 {
67 //is complete
68 upload.UploadComplete = true;
69 AssetUploadCompletePacket response = new AssetUploadCompletePacket();
70 response.AssetBlock.Type = asset.Type;
71 response.AssetBlock.Success = true;
72 response.AssetBlock.UUID = transactionID.Combine(this.ourClient.SecureSessionID);
73 this.ourClient.OutPacket(response);
74 m_assetCache.AddAsset(asset);
75 }
76 else
77 {
78 upload.UploadComplete = false;
79 upload.XferID = Util.GetNextXferID();
80 RequestXferPacket xfer = new RequestXferPacket();
81 xfer.XferID.ID = upload.XferID;
82 xfer.XferID.VFileType = upload.Asset.Type;
83 xfer.XferID.VFileID = transactionID.Combine(this.ourClient.SecureSessionID);
84 xfer.XferID.FilePath = 0;
85 xfer.XferID.Filename = new byte[0];
86 this.ourClient.OutPacket(xfer);
87 }
88
89 }
90
91 public AssetBase GetUpload(LLUUID transactionID)
92 {
93 if (this.transactions.ContainsKey(transactionID))
94 {
95 return this.transactions[transactionID].Asset;
96 }
97
98 return null;
99 }
100
101 public void HandleUploadPacket(AssetUploadRequestPacket pack, LLUUID assetID)
102 {
103 // Console.Write("asset upload request , type = " + pack.AssetBlock.Type.ToString());
104 AssetBase asset = null;
105 if (pack.AssetBlock.Type == 0)
106 {
107
108 //first packet for transaction
109 asset = new AssetBase();
110 asset.FullID = assetID;
111 asset.Type = pack.AssetBlock.Type;
112 asset.InvType = asset.Type;
113 asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000");
114 asset.Data = pack.AssetBlock.AssetData;
115
116
117 }
118 else if (pack.AssetBlock.Type == 13 | pack.AssetBlock.Type == 5 | pack.AssetBlock.Type == 7)
119 {
120
121 asset = new AssetBase();
122 asset.FullID = assetID;
123 // Console.WriteLine("skin asset id is " + assetID.ToStringHyphenated());
124 asset.Type = pack.AssetBlock.Type;
125 asset.InvType = asset.Type;
126 asset.Name = "NewClothing" + Util.RandomClass.Next(1, 1000).ToString("000");
127 asset.Data = pack.AssetBlock.AssetData;
128
129
130 }
131
132 if (asset != null)
133 {
134 this.AddUpload(pack.AssetBlock.TransactionID, asset);
135 }
136 else
137 {
138
139 //currently we don't support this asset type
140 //so lets just tell the client that the upload is complete
141 AssetUploadCompletePacket response = new AssetUploadCompletePacket();
142 response.AssetBlock.Type = pack.AssetBlock.Type;
143 response.AssetBlock.Success = true;
144 response.AssetBlock.UUID = pack.AssetBlock.TransactionID.Combine(this.ourClient.SecureSessionID);
145 this.ourClient.OutPacket(response);
146 }
147
148 }
149
150 #region Xfer packet system for larger uploads
151
152 public void HandleXferPacket(SendXferPacketPacket xferPacket)
153 {
154 lock (this.transactions)
155 {
156 foreach (AssetTransaction trans in this.transactions.Values)
157 {
158 if (trans.XferID == xferPacket.XferID.ID)
159 {
160 if (trans.Asset.Data.Length > 1)
161 {
162 byte[] newArray = new byte[trans.Asset.Data.Length + xferPacket.DataPacket.Data.Length];
163 Array.Copy(trans.Asset.Data, 0, newArray, 0, trans.Asset.Data.Length);
164 Array.Copy(xferPacket.DataPacket.Data, 0, newArray, trans.Asset.Data.Length, xferPacket.DataPacket.Data.Length);
165 trans.Asset.Data = newArray;
166 }
167 else
168 {
169 byte[] newArray = new byte[xferPacket.DataPacket.Data.Length - 4];
170 Array.Copy(xferPacket.DataPacket.Data, 4, newArray, 0, xferPacket.DataPacket.Data.Length - 4);
171 trans.Asset.Data = newArray;
172 }
173
174 if ((xferPacket.XferID.Packet & 2147483648) != 0)
175 {
176 //end of transfer
177 trans.UploadComplete = true;
178 AssetUploadCompletePacket response = new AssetUploadCompletePacket();
179 response.AssetBlock.Type = trans.Asset.Type;
180 response.AssetBlock.Success = true;
181 response.AssetBlock.UUID = trans.TransactionID.Combine(this.ourClient.SecureSessionID);
182 this.ourClient.OutPacket(response);
183
184 m_assetCache.AddAsset(trans.Asset);
185 //check if we should add it to inventory
186 if (trans.AddToInventory)
187 {
188 // m_assetCache.AddAsset(trans.Asset);
189 m_inventoryCache.AddNewInventoryItem(this.ourClient, trans.InventFolder, trans.Asset);
190 }
191
192
193 }
194 break;
195 }
196
197 }
198 }
199
200 ConfirmXferPacketPacket confirmXfer = new ConfirmXferPacketPacket();
201 confirmXfer.XferID.ID = xferPacket.XferID.ID;
202 confirmXfer.XferID.Packet = xferPacket.XferID.Packet;
203 this.ourClient.OutPacket(confirmXfer);
204 }
205
206 #endregion
207
208 public AssetBase AddUploadToAssetCache(LLUUID transactionID)
209 {
210 AssetBase asset = null;
211 if (this.transactions.ContainsKey(transactionID))
212 {
213 AssetTransaction trans = this.transactions[transactionID];
214 if (trans.UploadComplete)
215 {
216 m_assetCache.AddAsset(trans.Asset);
217 asset = trans.Asset;
218 }
219 }
220
221 return asset;
222 }
223
224 public void CreateInventoryItem(CreateInventoryItemPacket packet)
225 {
226 if (this.transactions.ContainsKey(packet.InventoryBlock.TransactionID))
227 {
228 AssetTransaction trans = this.transactions[packet.InventoryBlock.TransactionID];
229 trans.Asset.Description = Util.FieldToString(packet.InventoryBlock.Description);
230 trans.Asset.Name = Util.FieldToString(packet.InventoryBlock.Name);
231 trans.Asset.Type = packet.InventoryBlock.Type;
232 trans.Asset.InvType = packet.InventoryBlock.InvType;
233 if (trans.UploadComplete)
234 {
235 //already complete so we can add it to the inventory
236 //m_assetCache.AddAsset(trans.Asset);
237 m_inventoryCache.AddNewInventoryItem(this.ourClient, packet.InventoryBlock.FolderID, trans.Asset);
238 }
239 else
240 {
241 trans.AddToInventory = true;
242 trans.InventFolder = packet.InventoryBlock.FolderID;
243 }
244 }
245 }
246
247 private class AssetTransaction
248 {
249 public uint XferID;
250 public AssetBase Asset;
251 public bool AddToInventory;
252 public LLUUID InventFolder = LLUUID.Zero;
253 public bool UploadComplete = false;
254 public LLUUID TransactionID = LLUUID.Zero;
255
256 public AssetTransaction()
257 {
258
259 }
260 }
261
262 //new class , not currently used.
263 public class AssetXferUploader
264 {
265 private IClientAPI ourClient;
266
267 public bool UploadComplete = false;
268
269 public bool AddToInventory;
270 public LLUUID InventFolder = LLUUID.Zero;
271
272 public uint XferID;
273 public AssetBase Asset;
274 public LLUUID TransactionID = LLUUID.Zero;
275
276
277 public AssetXferUploader(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data)
278 {
279 ourClient = remoteClient;
280 Asset = new AssetBase();
281 Asset.FullID = assetID;
282 Asset.InvType = type;
283 Asset.Type = type;
284 Asset.Data = data;
285 Asset.Name = "blank";
286 Asset.Description = "empty";
287 TransactionID = transaction;
288
289 if (Asset.Data.Length > 2)
290 {
291 //data block should only have data in it, if there is no more data to be uploaded
292 this.SendCompleteMessage();
293 }
294 else
295 {
296 this.ReqestStartXfer();
297 }
298 }
299
300 protected void SendCompleteMessage()
301 {
302 UploadComplete = true;
303 AssetUploadCompletePacket response = new AssetUploadCompletePacket();
304 response.AssetBlock.Type = Asset.Type;
305 response.AssetBlock.Success = true;
306 response.AssetBlock.UUID = Asset.FullID;
307 this.ourClient.OutPacket(response);
308
309 //TODO trigger event
310 }
311
312 protected void ReqestStartXfer()
313 {
314 UploadComplete = false;
315 XferID = Util.GetNextXferID();
316 RequestXferPacket xfer = new RequestXferPacket();
317 xfer.XferID.ID = XferID;
318 xfer.XferID.VFileType = Asset.Type;
319 xfer.XferID.VFileID = Asset.FullID;
320 xfer.XferID.FilePath = 0;
321 xfer.XferID.Filename = new byte[0];
322 this.ourClient.OutPacket(xfer);
323 }
324
325 public void HandleXferPacket(uint xferID, uint packetID, byte[] data)
326 {
327 if (XferID == xferID)
328 {
329 if (Asset.Data.Length > 1)
330 {
331 byte[] newArray = new byte[Asset.Data.Length + data.Length];
332 Array.Copy(Asset.Data, 0, newArray, 0, Asset.Data.Length);
333 Array.Copy(data, 0, newArray, Asset.Data.Length, data.Length);
334 Asset.Data = newArray;
335 }
336 else
337 {
338 byte[] newArray = new byte[data.Length - 4];
339 Array.Copy(data, 4, newArray, 0, data.Length - 4);
340 Asset.Data = newArray;
341 }
342
343 ConfirmXferPacketPacket confirmXfer = new ConfirmXferPacketPacket();
344 confirmXfer.XferID.ID = xferID;
345 confirmXfer.XferID.Packet = packetID;
346 this.ourClient.OutPacket(confirmXfer);
347
348 if ((packetID & 2147483648) != 0)
349 {
350 this.SendCompleteMessage();
351 }
352 }
353 }
354 }
355 }
356 }
357}
diff --git a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs
new file mode 100644
index 0000000..e67807e
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs
@@ -0,0 +1,236 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using libsecondlife;
29using libsecondlife.Packets;
30using OpenSim.Framework.Console;
31
32namespace OpenSim.Region.ClientStack
33{
34 public partial class ClientView
35 {
36 protected virtual void RegisterLocalPacketHandlers()
37 {
38 this.AddLocalPacketHandler(PacketType.LogoutRequest, this.Logout);
39 this.AddLocalPacketHandler(PacketType.AgentCachedTexture, this.AgentTextureCached);
40 this.AddLocalPacketHandler(PacketType.MultipleObjectUpdate, this.MultipleObjUpdate);
41 }
42
43 protected virtual bool Logout(ClientView simClient, Packet packet)
44 {
45 MainLog.Instance.Verbose( "OpenSimClient.cs:ProcessInPacket() - Got a logout request");
46 //send reply to let the client logout
47 LogoutReplyPacket logReply = new LogoutReplyPacket();
48 logReply.AgentData.AgentID = this.AgentID;
49 logReply.AgentData.SessionID = this.SessionID;
50 logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
51 logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
52 logReply.InventoryData[0].ItemID = LLUUID.Zero;
53 OutPacket(logReply);
54 //
55 this.KillClient();
56 return true;
57 }
58
59 protected bool AgentTextureCached(ClientView simclient, Packet packet)
60 {
61 // Console.WriteLine(packet.ToString());
62 AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet;
63 AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket();
64 cachedresp.AgentData.AgentID = this.AgentID;
65 cachedresp.AgentData.SessionID = this.SessionID;
66 cachedresp.AgentData.SerialNum = this.cachedtextureserial;
67 this.cachedtextureserial++;
68 cachedresp.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[chechedtex.WearableData.Length];
69 for (int i = 0; i < chechedtex.WearableData.Length; i++)
70 {
71 cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
72 cachedresp.WearableData[i].TextureIndex = chechedtex.WearableData[i].TextureIndex;
73 cachedresp.WearableData[i].TextureID = LLUUID.Zero;
74 cachedresp.WearableData[i].HostName = new byte[0];
75 }
76 this.OutPacket(cachedresp);
77 return true;
78 }
79
80 protected bool MultipleObjUpdate(ClientView simClient, Packet packet)
81 {
82 MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
83 //System.Console.WriteLine("new multi update packet " + multipleupdate.ToString());
84 for (int i = 0; i < multipleupdate.ObjectData.Length; i++)
85 {
86 #region position
87 if (multipleupdate.ObjectData[i].Type == 9) //change position
88 {
89 if (OnUpdatePrimGroupPosition != null)
90 {
91 LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0);
92 OnUpdatePrimGroupPosition(multipleupdate.ObjectData[i].ObjectLocalID, pos, this);
93 }
94
95 }
96 else if (multipleupdate.ObjectData[i].Type == 1) //single item of group change position
97 {
98 if (OnUpdatePrimSinglePosition != null)
99 {
100 libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0);
101 // System.Console.WriteLine("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
102 OnUpdatePrimSinglePosition(multipleupdate.ObjectData[i].ObjectLocalID, pos, this);
103 }
104 }
105 #endregion position
106 #region rotation
107 else if (multipleupdate.ObjectData[i].Type == 2)// single item of group rotation from tab
108 {
109 if (OnUpdatePrimSingleRotation != null)
110 {
111 LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true);
112 // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
113 OnUpdatePrimSingleRotation(multipleupdate.ObjectData[i].ObjectLocalID, rot, this);
114 }
115 }
116 else if (multipleupdate.ObjectData[i].Type == 3)// single item of group rotation from mouse
117 {
118 if (OnUpdatePrimSingleRotation != null)
119 {
120 libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 12, true);
121 // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
122 OnUpdatePrimSingleRotation(multipleupdate.ObjectData[i].ObjectLocalID, rot, this);
123 }
124 }
125 else if (multipleupdate.ObjectData[i].Type == 10)//group rotation from object tab
126 {
127 if (OnUpdatePrimGroupRotation != null)
128 {
129 libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true);
130 // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
131 OnUpdatePrimGroupRotation(multipleupdate.ObjectData[i].ObjectLocalID, rot, this);
132 }
133 }
134 else if (multipleupdate.ObjectData[i].Type == 11)//group rotation from mouse
135 {
136 if (OnUpdatePrimGroupMouseRotation != null)
137 {
138 libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0);
139 libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 12, true);
140 //Console.WriteLine("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
141 // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
142 OnUpdatePrimGroupMouseRotation(multipleupdate.ObjectData[i].ObjectLocalID, pos, rot, this);
143 }
144 }
145 #endregion
146 #region scale
147 else if (multipleupdate.ObjectData[i].Type == 13)//group scale from object tab
148 {
149 if (OnUpdatePrimScale != null)
150 {
151 LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12);
152 //Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
153 OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this);
154 }
155 }
156 else if (multipleupdate.ObjectData[i].Type == 29)//group scale from mouse
157 {
158 if (OnUpdatePrimScale != null)
159 {
160 libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 0);
161 // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z );
162 // OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this);
163 }
164 }
165 else if (multipleupdate.ObjectData[i].Type == 5)//single prim scale from object tab
166 {
167 if (OnUpdatePrimScale != null)
168 {
169 libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12);
170 // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
171 OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this);
172 }
173 }
174 else if (multipleupdate.ObjectData[i].Type == 21)//single prim scale from mouse
175 {
176 if (OnUpdatePrimScale != null)
177 {
178 libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12);
179 // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
180 OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this);
181 }
182 }
183 #endregion
184 }
185 return true;
186 }
187
188 public void RequestMapLayer()
189 {
190 //should be getting the map layer from the grid server
191 //send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
192 MapLayerReplyPacket mapReply = new MapLayerReplyPacket();
193 mapReply.AgentData.AgentID = this.AgentID;
194 mapReply.AgentData.Flags = 0;
195 mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
196 mapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock();
197 mapReply.LayerData[0].Bottom = 0;
198 mapReply.LayerData[0].Left = 0;
199 mapReply.LayerData[0].Top = 30000;
200 mapReply.LayerData[0].Right = 30000;
201 mapReply.LayerData[0].ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
202 this.OutPacket(mapReply);
203 }
204
205 public void RequestMapBlocks(int minX, int minY, int maxX, int maxY)
206 {
207 /*
208 IList simMapProfiles = m_gridServer.RequestMapBlocks(minX, minY, maxX, maxY);
209 MapBlockReplyPacket mbReply = new MapBlockReplyPacket();
210 mbReply.AgentData.AgentID = this.AgentID;
211 int len;
212 if (simMapProfiles == null)
213 len = 0;
214 else
215 len = simMapProfiles.Count;
216
217 mbReply.Data = new MapBlockReplyPacket.DataBlock[len];
218 int iii;
219 for (iii = 0; iii < len; iii++)
220 {
221 Hashtable mp = (Hashtable)simMapProfiles[iii];
222 mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock();
223 mbReply.Data[iii].Name = System.Text.Encoding.UTF8.GetBytes((string)mp["name"]);
224 mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]);
225 mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]);
226 mbReply.Data[iii].MapImageID = new LLUUID((string)mp["map-image-id"]);
227 mbReply.Data[iii].RegionFlags = System.Convert.ToUInt32(mp["region-flags"]);
228 mbReply.Data[iii].WaterHeight = System.Convert.ToByte(mp["water-height"]);
229 mbReply.Data[iii].X = System.Convert.ToUInt16(mp["x"]);
230 mbReply.Data[iii].Y = System.Convert.ToUInt16(mp["y"]);
231 }
232 this.OutPacket(mbReply);
233 */
234 }
235 }
236}
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
new file mode 100644
index 0000000..3265898
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -0,0 +1,596 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using libsecondlife;
32using libsecondlife.Packets;
33using OpenSim.Framework.Inventory;
34using OpenSim.Framework.Types;
35using OpenSim.Framework.Utilities;
36
37namespace OpenSim.Region.ClientStack
38{
39 public partial class ClientView
40 {
41 protected override void ProcessInPacket(Packet Pack)
42 {
43 ack_pack(Pack);
44 if (debug)
45 {
46 if (Pack.Type != PacketType.AgentUpdate)
47 {
48 Console.WriteLine(CircuitCode + ":IN: " + Pack.Type.ToString());
49 }
50 }
51
52 if (this.ProcessPacketMethod(Pack))
53 {
54 //there is a handler registered that handled this packet type
55 return;
56 }
57 else
58 {
59 Encoding _enc = Encoding.ASCII;
60
61 switch (Pack.Type)
62 {
63 case PacketType.ViewerEffect:
64 ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
65 foreach (ClientView client in m_clientThreads.Values)
66 {
67 if (client.AgentID != this.AgentID)
68 {
69 viewer.AgentData.AgentID = client.AgentID;
70 viewer.AgentData.SessionID = client.SessionID;
71 client.OutPacket(viewer);
72 }
73 }
74 break;
75
76 #region World/Avatar
77 case PacketType.ChatFromViewer:
78 ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
79 if (Util.FieldToString(inchatpack.ChatData.Message) == "")
80 {
81 //empty message so don't bother with it
82 break;
83 }
84 string fromName = ""; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
85 byte[] message = inchatpack.ChatData.Message;
86 byte type = inchatpack.ChatData.Type;
87 LLVector3 fromPos = new LLVector3(); // ClientAvatar.Pos;
88 LLUUID fromAgentID = AgentID;
89 if (OnChatFromViewer != null)
90 {
91 this.OnChatFromViewer(message, type, fromPos, fromName, fromAgentID);
92 }
93 break;
94 case PacketType.ImprovedInstantMessage:
95 ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket)Pack;
96
97 string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName);
98 string IMmessage = Util.FieldToString(msgpack.MessageBlock.Message);
99
100 if (OnInstantMessage != null)
101 {
102 this.OnInstantMessage(msgpack.AgentData.AgentID, msgpack.MessageBlock.ToAgentID,
103 msgpack.MessageBlock.Timestamp, IMfromName, IMmessage);
104 }
105
106 break;
107
108 case PacketType.RezObject:
109 RezObjectPacket rezPacket = (RezObjectPacket)Pack;
110 AgentInventory inven = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
111 if (inven != null)
112 {
113 if (inven.InventoryItems.ContainsKey(rezPacket.InventoryData.ItemID))
114 {
115 AssetBase asset = this.m_assetCache.GetAsset(inven.InventoryItems[rezPacket.InventoryData.ItemID].AssetID);
116 if (asset != null)
117 {
118 if (OnRezObject != null)
119 {
120 this.OnRezObject(asset, rezPacket.RezData.RayEnd);
121 this.m_inventoryCache.DeleteInventoryItem(this, rezPacket.InventoryData.ItemID);
122 }
123 }
124 }
125 }
126 break;
127 case PacketType.DeRezObject:
128 if (OnDeRezObject != null)
129 {
130 OnDeRezObject(Pack, this);
131 }
132 break;
133 case PacketType.ModifyLand:
134 ModifyLandPacket modify = (ModifyLandPacket)Pack;
135 if (modify.ParcelData.Length > 0)
136 {
137 if (OnModifyTerrain != null)
138 {
139 OnModifyTerrain(modify.ModifyBlock.Height, modify.ModifyBlock.Seconds, modify.ModifyBlock.BrushSize,
140 modify.ModifyBlock.Action, modify.ParcelData[0].North, modify.ParcelData[0].West);
141 }
142 }
143 break;
144 case PacketType.RegionHandshakeReply:
145 if (OnRegionHandShakeReply != null)
146 {
147 OnRegionHandShakeReply(this);
148 }
149 break;
150 case PacketType.AgentWearablesRequest:
151 if (OnRequestWearables != null)
152 {
153 OnRequestWearables(this);
154 }
155 if (OnRequestAvatarsData != null)
156 {
157 OnRequestAvatarsData(this);
158 }
159 break;
160 case PacketType.AgentSetAppearance:
161 AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
162 if (OnSetAppearance != null)
163 {
164 OnSetAppearance(appear.ObjectData.TextureEntry, appear.VisualParam);
165 }
166 break;
167 case PacketType.CompleteAgentMovement:
168 if (OnCompleteMovementToRegion != null)
169 {
170 OnCompleteMovementToRegion();
171 }
172 break;
173 case PacketType.AgentUpdate:
174 if (OnAgentUpdate != null)
175 {
176 AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
177 OnAgentUpdate(this, agenUpdate.AgentData.ControlFlags, agenUpdate.AgentData.BodyRotation);
178 }
179 break;
180 case PacketType.AgentAnimation:
181 if (!m_child)
182 {
183 AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
184 for (int i = 0; i < AgentAni.AnimationList.Length; i++)
185 {
186 if (AgentAni.AnimationList[i].StartAnim)
187 {
188 if (OnStartAnim != null)
189 {
190 OnStartAnim(AgentAni.AnimationList[i].AnimID, 1);
191 }
192 }
193 }
194 }
195 break;
196
197 #endregion
198
199 #region Objects/Prims
200 case PacketType.ObjectLink:
201 // OpenSim.Framework.Console.MainLog.Instance.Verbose( Pack.ToString());
202 ObjectLinkPacket link = (ObjectLinkPacket)Pack;
203 uint parentprimid = 0;
204 List<uint> childrenprims = new List<uint>();
205 if (link.ObjectData.Length > 1)
206 {
207 parentprimid = link.ObjectData[0].ObjectLocalID;
208
209 for (int i = 1; i < link.ObjectData.Length; i++)
210 {
211 childrenprims.Add(link.ObjectData[i].ObjectLocalID);
212 }
213 }
214 if (OnLinkObjects != null)
215 {
216 OnLinkObjects(parentprimid, childrenprims);
217 }
218 break;
219 case PacketType.ObjectAdd:
220 if (OnAddPrim != null)
221 {
222 OnAddPrim(Pack, this);
223 }
224 break;
225 case PacketType.ObjectShape:
226 ObjectShapePacket shape = (ObjectShapePacket)Pack;
227 for (int i = 0; i < shape.ObjectData.Length; i++)
228 {
229 if (OnUpdatePrimShape != null)
230 {
231 OnUpdatePrimShape(shape.ObjectData[i].ObjectLocalID, shape.ObjectData[i]);
232 }
233 }
234 break;
235 case PacketType.ObjectDuplicate:
236 ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack;
237 for (int i = 0; i < dupe.ObjectData.Length; i++)
238 {
239 if (OnObjectDuplicate != null)
240 {
241 OnObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset, dupe.SharedData.DuplicateFlags);
242 }
243 }
244
245 break;
246
247 case PacketType.ObjectSelect:
248 ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
249 for (int i = 0; i < incomingselect.ObjectData.Length; i++)
250 {
251 if (OnObjectSelect != null)
252 {
253 OnObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this);
254 }
255 }
256 break;
257 case PacketType.ObjectFlagUpdate:
258 ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
259 if (OnUpdatePrimFlags != null)
260 {
261 OnUpdatePrimFlags(flags.AgentData.ObjectLocalID, Pack, this);
262 }
263 break;
264 case PacketType.ObjectImage:
265 ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
266 for (int i = 0; i < imagePack.ObjectData.Length; i++)
267 {
268 if (OnUpdatePrimTexture != null)
269 {
270 OnUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID, imagePack.ObjectData[i].TextureEntry, this);
271 }
272 }
273 break;
274 case PacketType.ObjectGrab:
275 ObjectGrabPacket grap = (ObjectGrabPacket)Pack;
276 if (OnGrapObject != null)
277 {
278 OnGrapObject(grap.ObjectData.LocalID, grap.ObjectData.GrabOffset, this);
279 }
280 break;
281 case PacketType.ObjectGrabUpdate:
282 ObjectGrabUpdatePacket grapUpdate = (ObjectGrabUpdatePacket)Pack;
283 if (OnGrapUpdate != null)
284 {
285 OnGrapUpdate(grapUpdate.ObjectData.ObjectID, grapUpdate.ObjectData.GrabOffsetInitial, grapUpdate.ObjectData.GrabPosition, this);
286 }
287 break;
288 case PacketType.ObjectDeGrab:
289 ObjectDeGrabPacket deGrap = (ObjectDeGrabPacket)Pack;
290 if (OnDeGrapObject != null)
291 {
292 OnDeGrapObject(deGrap.ObjectData.LocalID, this);
293 }
294 break;
295 case PacketType.ObjectDescription:
296 ObjectDescriptionPacket objDes = (ObjectDescriptionPacket)Pack;
297 for (int i = 0; i < objDes.ObjectData.Length; i++)
298 {
299 if (OnObjectDescription != null)
300 {
301 OnObjectDescription(objDes.ObjectData[i].LocalID, enc.GetString(objDes.ObjectData[i].Description));
302 }
303 }
304 break;
305 case PacketType.ObjectName:
306 ObjectNamePacket objName = (ObjectNamePacket)Pack;
307 for (int i = 0; i < objName.ObjectData.Length; i++)
308 {
309 if (OnObjectName != null)
310 {
311 OnObjectName(objName.ObjectData[i].LocalID, enc.GetString(objName.ObjectData[i].Name));
312 }
313 }
314 break;
315 case PacketType.ObjectPermissions:
316 //Console.WriteLine("permissions set " + Pack.ToString());
317 break;
318 #endregion
319
320 #region Inventory/Asset/Other related packets
321 case PacketType.RequestImage:
322 RequestImagePacket imageRequest = (RequestImagePacket)Pack;
323 for (int i = 0; i < imageRequest.RequestImage.Length; i++)
324 {
325 m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image);
326 }
327 break;
328 case PacketType.TransferRequest:
329 //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request");
330 TransferRequestPacket transfer = (TransferRequestPacket)Pack;
331 m_assetCache.AddAssetRequest(this, transfer);
332 break;
333 case PacketType.AssetUploadRequest:
334 AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
335 this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID));
336 break;
337 case PacketType.RequestXfer:
338 //Console.WriteLine(Pack.ToString());
339 break;
340 case PacketType.SendXferPacket:
341 this.UploadAssets.HandleXferPacket((SendXferPacketPacket)Pack);
342 break;
343 case PacketType.CreateInventoryFolder:
344 CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
345 m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID);
346 //Console.WriteLine(Pack.ToString());
347 break;
348 case PacketType.CreateInventoryItem:
349 //Console.WriteLine(Pack.ToString());
350 CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
351 if (createItem.InventoryBlock.TransactionID != LLUUID.Zero)
352 {
353 this.UploadAssets.CreateInventoryItem(createItem);
354 }
355 else
356 {
357 // Console.Write(Pack.ToString());
358 this.CreateInventoryItem(createItem);
359 }
360 break;
361 case PacketType.FetchInventory:
362 //Console.WriteLine("fetch item packet");
363 FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack;
364 m_inventoryCache.FetchInventory(this, FetchInventory);
365 break;
366 case PacketType.FetchInventoryDescendents:
367 FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
368 m_inventoryCache.FetchInventoryDescendents(this, Fetch);
369 break;
370 case PacketType.UpdateInventoryItem:
371 UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack;
372 //Console.WriteLine(Pack.ToString());
373 for (int i = 0; i < update.InventoryData.Length; i++)
374 {
375 if (update.InventoryData[i].TransactionID != LLUUID.Zero)
376 {
377 AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID));
378 if (asset != null)
379 {
380 // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " already in cache");
381 m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
382 }
383 else
384 {
385 asset = this.UploadAssets.AddUploadToAssetCache(update.InventoryData[i].TransactionID);
386 if (asset != null)
387 {
388 //Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToStringHyphenated() + " to cache");
389 m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
390 }
391 else
392 {
393 //Console.WriteLine("trying to update inventory item, but asset is null");
394 }
395 }
396 }
397 else
398 {
399 m_inventoryCache.UpdateInventoryItemDetails(this, update.InventoryData[i].ItemID, update.InventoryData[i]); ;
400 }
401 }
402 break;
403 case PacketType.RequestTaskInventory:
404 // Console.WriteLine(Pack.ToString());
405 RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
406 ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket();
407 //bool foundent = false;
408 /* foreach (Entity ent in m_world.Entities.Values)
409 {
410 if (ent.localid == requesttask.InventoryData.LocalID)
411 {
412 replytask.InventoryData.TaskID = ent.uuid;
413 replytask.InventoryData.Serial = 0;
414 replytask.InventoryData.Filename = new byte[0];
415 foundent = true;
416 }
417 }
418 if (foundent)
419 {
420 this.OutPacket(replytask);
421 }*/
422 break;
423 case PacketType.UpdateTaskInventory:
424 // Console.WriteLine(Pack.ToString());
425 UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
426 AgentInventory myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
427 /*if (myinventory != null)
428 {
429 if (updatetask.UpdateData.Key == 0)
430 {
431 if (myinventory.InventoryItems[updatetask.InventoryData.ItemID] != null)
432 {
433 if (myinventory.InventoryItems[updatetask.InventoryData.ItemID].Type == 7)
434 {
435 LLUUID noteaid = myinventory.InventoryItems[updatetask.InventoryData.ItemID].AssetID;
436 AssetBase assBase = this.m_assetCache.GetAsset(noteaid);
437 if (assBase != null)
438 {
439 foreach (Entity ent in m_world.Entities.Values)
440 {
441 if (ent.localid == updatetask.UpdateData.LocalID)
442 {
443 if (ent is OpenSim.world.Primitive)
444 {
445 this.m_world.AddScript(ent, Util.FieldToString(assBase.Data));
446 }
447 }
448 }
449 }
450 }
451 }
452 }
453 }*/
454 break;
455 case PacketType.MapLayerRequest:
456 this.RequestMapLayer();
457 break;
458 case PacketType.MapBlockRequest:
459 MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
460 if (OnRequestMapBlocks != null)
461 {
462 OnRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY);
463 }
464 break;
465 case PacketType.TeleportLandmarkRequest:
466 TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
467
468 TeleportStartPacket tpStart = new TeleportStartPacket();
469 tpStart.Info.TeleportFlags = 8; // tp via lm
470 this.OutPacket(tpStart);
471
472 TeleportProgressPacket tpProgress = new TeleportProgressPacket();
473 tpProgress.Info.Message = (new ASCIIEncoding()).GetBytes("sending_landmark");
474 tpProgress.Info.TeleportFlags = 8;
475 tpProgress.AgentData.AgentID = tpReq.Info.AgentID;
476 this.OutPacket(tpProgress);
477
478 // Fetch landmark
479 LLUUID lmid = tpReq.Info.LandmarkID;
480 AssetBase lma = this.m_assetCache.GetAsset(lmid);
481 if (lma != null)
482 {
483 AssetLandmark lm = new AssetLandmark(lma);
484
485 if (lm.RegionID == m_world.RegionInfo.SimUUID)
486 {
487 TeleportLocalPacket tpLocal = new TeleportLocalPacket();
488
489 tpLocal.Info.AgentID = tpReq.Info.AgentID;
490 tpLocal.Info.TeleportFlags = 8; // Teleport via landmark
491 tpLocal.Info.LocationID = 2;
492 tpLocal.Info.Position = lm.Position;
493 OutPacket(tpLocal);
494 }
495 else
496 {
497 TeleportCancelPacket tpCancel = new TeleportCancelPacket();
498 tpCancel.Info.AgentID = tpReq.Info.AgentID;
499 tpCancel.Info.SessionID = tpReq.Info.SessionID;
500 OutPacket(tpCancel);
501 }
502 }
503 else
504 {
505 Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented");
506
507 TeleportCancelPacket tpCancel = new TeleportCancelPacket();
508 tpCancel.Info.AgentID = tpReq.Info.AgentID;
509 tpCancel.Info.SessionID = tpReq.Info.SessionID;
510 OutPacket(tpCancel);
511 }
512 break;
513 case PacketType.TeleportLocationRequest:
514 TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
515 // Console.WriteLine(tpLocReq.ToString());
516
517 if (OnTeleportLocationRequest != null)
518 {
519 OnTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position, tpLocReq.Info.LookAt, 16);
520 }
521 else
522 {
523 //no event handler so cancel request
524 TeleportCancelPacket tpCancel = new TeleportCancelPacket();
525 tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
526 tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
527 OutPacket(tpCancel);
528 }
529 break;
530 #endregion
531
532 case PacketType.MoneyBalanceRequest:
533 this.SendMoneyBalance(LLUUID.Zero, true, new byte[0], 1000);
534 break;
535 case PacketType.UUIDNameRequest:
536 UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
537 foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock)
538 {
539 OnNameFromUUIDRequest(UUIDBlock.ID, this);
540 }
541 break;
542 #region Parcel related packets
543 case PacketType.ParcelPropertiesRequest:
544 ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
545 if (OnParcelPropertiesRequest != null)
546 {
547 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);
548 }
549 break;
550 case PacketType.ParcelDivide:
551 ParcelDividePacket parcelDivide = (ParcelDividePacket)Pack;
552 if (OnParcelDivideRequest != null)
553 {
554 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);
555 }
556 break;
557 case PacketType.ParcelJoin:
558 ParcelJoinPacket parcelJoin = (ParcelJoinPacket)Pack;
559 if (OnParcelJoinRequest != null)
560 {
561 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);
562 }
563 break;
564 case PacketType.ParcelPropertiesUpdate:
565 ParcelPropertiesUpdatePacket updatePacket = (ParcelPropertiesUpdatePacket)Pack;
566 if (OnParcelPropertiesUpdateRequest != null)
567 {
568 OnParcelPropertiesUpdateRequest(updatePacket, this);
569 }
570 break;
571 #endregion
572
573 #region Estate Packets
574 case PacketType.EstateOwnerMessage:
575 EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
576 if (OnEstateOwnerMessage != null)
577 {
578 OnEstateOwnerMessage(messagePacket, this);
579 }
580 break;
581 #endregion
582
583 #region unimplemented handlers
584 case PacketType.AgentIsNowWearing:
585 // AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack;
586 //Console.WriteLine(Pack.ToString());
587 break;
588 case PacketType.ObjectScale:
589 //OpenSim.Framework.Console.MainLog.Instance.Verbose( Pack.ToString());
590 break;
591 #endregion
592 }
593 }
594 }
595 }
596}
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
new file mode 100644
index 0000000..0fe3884
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -0,0 +1,293 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Net;
31using System.Text;
32using System.Threading;
33using System.Timers;
34using libsecondlife;
35using libsecondlife.Packets;
36using OpenSim.Assets;
37using OpenSim.Framework;
38using OpenSim.Framework.Console;
39using OpenSim.Framework.Interfaces;
40using OpenSim.Framework.Inventory;
41using OpenSim.Framework.Types;
42using OpenSim.Framework.Utilities;
43using OpenSim.Region.Caches;
44using Timer=System.Timers.Timer;
45
46namespace OpenSim.Region.ClientStack
47{
48 public delegate bool PacketMethod(ClientView simClient, Packet packet);
49
50 /// <summary>
51 /// Handles new client connections
52 /// Constructor takes a single Packet and authenticates everything
53 /// </summary>
54 public partial class ClientView : ClientViewBase, IClientAPI
55 {
56 public static TerrainManager TerrainManager;
57
58 protected static Dictionary<PacketType, PacketMethod> PacketHandlers = new Dictionary<PacketType, PacketMethod>(); //Global/static handlers for all clients
59 protected Dictionary<PacketType, PacketMethod> m_packetHandlers = new Dictionary<PacketType, PacketMethod>(); //local handlers for this instance
60
61 public LLUUID AgentID;
62 public LLUUID SessionID;
63 public LLUUID SecureSessionID = LLUUID.Zero;
64 public string firstName;
65 public string lastName;
66 public bool m_child = false;
67 private UseCircuitCodePacket cirpack;
68 public Thread ClientThread;
69 public LLVector3 startpos;
70
71 private AgentAssetUpload UploadAssets;
72 private LLUUID newAssetFolder = LLUUID.Zero;
73 private bool debug = false;
74 protected IWorld m_world;
75 private Dictionary<uint, ClientView> m_clientThreads;
76 private AssetCache m_assetCache;
77 private InventoryCache m_inventoryCache;
78 private int cachedtextureserial = 0;
79 protected AuthenticateSessionsBase m_authenticateSessionsHandler;
80 private Encoding enc = Encoding.ASCII;
81 // Dead client detection vars
82 private Timer clientPingTimer;
83 private int packetsReceived = 0;
84 private int probesWithNoIngressPackets = 0;
85 private int lastPacketsReceived = 0;
86
87 public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary<uint, ClientView> clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions )
88 {
89 m_world = world;
90 m_clientThreads = clientThreads;
91 m_assetCache = assetCache;
92
93 m_networkServer = packServer;
94 m_inventoryCache = inventoryCache;
95 m_authenticateSessionsHandler = authenSessions;
96
97 MainLog.Instance.Verbose( "OpenSimClient.cs - Started up new client thread to handle incoming request");
98 cirpack = initialcirpack;
99 userEP = remoteEP;
100
101 this.startpos = m_authenticateSessionsHandler.GetPosition(initialcirpack.CircuitCode.Code);
102
103 PacketQueue = new BlockingQueue<QueItem>();
104
105 this.UploadAssets = new AgentAssetUpload(this, m_assetCache, m_inventoryCache);
106 AckTimer = new Timer(500);
107 AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed);
108 AckTimer.Start();
109
110 this.RegisterLocalPacketHandlers();
111
112 ClientThread = new Thread(new ThreadStart(AuthUser));
113 ClientThread.IsBackground = true;
114 ClientThread.Start();
115 }
116
117 # region Client Methods
118
119 public void KillClient()
120 {
121 clientPingTimer.Stop();
122 this.m_inventoryCache.ClientLeaving(this.AgentID, null);
123 m_world.RemoveClient(this.AgentId);
124
125 m_clientThreads.Remove(this.CircuitCode);
126 m_networkServer.RemoveClientCircuit(this.CircuitCode);
127 this.ClientThread.Abort();
128 }
129 #endregion
130
131 # region Packet Handling
132 public static bool AddPacketHandler(PacketType packetType, PacketMethod handler)
133 {
134 bool result = false;
135 lock (PacketHandlers)
136 {
137 if (!PacketHandlers.ContainsKey(packetType))
138 {
139 PacketHandlers.Add(packetType, handler);
140 result = true;
141 }
142 }
143 return result;
144 }
145
146 public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler)
147 {
148 bool result = false;
149 lock (m_packetHandlers)
150 {
151 if (!m_packetHandlers.ContainsKey(packetType))
152 {
153 m_packetHandlers.Add(packetType, handler);
154 result = true;
155 }
156 }
157 return result;
158 }
159
160 protected virtual bool ProcessPacketMethod(Packet packet)
161 {
162 bool result = false;
163 bool found = false;
164 PacketMethod method;
165 if (m_packetHandlers.TryGetValue(packet.Type, out method))
166 {
167 //there is a local handler for this packet type
168 result = method(this, packet);
169 }
170 else
171 {
172 //there is not a local handler so see if there is a Global handler
173 lock (PacketHandlers)
174 {
175 found = PacketHandlers.TryGetValue(packet.Type, out method);
176 }
177 if (found)
178 {
179 result = method(this, packet);
180 }
181 }
182 return result;
183 }
184
185 protected virtual void ClientLoop()
186 {
187 MainLog.Instance.Verbose( "OpenSimClient.cs:ClientLoop() - Entered loop");
188 while (true)
189 {
190 QueItem nextPacket = PacketQueue.Dequeue();
191 if (nextPacket.Incoming)
192 {
193 //is a incoming packet
194 if (nextPacket.Packet.Type != PacketType.AgentUpdate) {
195 packetsReceived++;
196 }
197 ProcessInPacket(nextPacket.Packet);
198 }
199 else
200 {
201 //is a out going packet
202 ProcessOutPacket(nextPacket.Packet);
203 }
204 }
205 }
206 # endregion
207
208 protected void CheckClientConnectivity(object sender, ElapsedEventArgs e)
209 {
210 if (packetsReceived == lastPacketsReceived) {
211 probesWithNoIngressPackets++;
212 if (probesWithNoIngressPackets > 30) {
213 this.KillClient();
214 } else {
215 // this will normally trigger at least one packet (ping response)
216 SendStartPingCheck(0);
217 }
218 } else {
219 // Something received in the meantime - we can reset the counters
220 probesWithNoIngressPackets = 0;
221 lastPacketsReceived = packetsReceived;
222 }
223 }
224
225 # region Setup
226
227 protected virtual void InitNewClient()
228 {
229 clientPingTimer = new Timer(1000);
230 clientPingTimer.Elapsed += new ElapsedEventHandler(CheckClientConnectivity);
231 clientPingTimer.Enabled = true;
232
233 MainLog.Instance.Verbose( "OpenSimClient.cs:InitNewClient() - Adding viewer agent to world");
234 this.m_world.AddNewClient(this, false);
235 }
236
237 protected virtual void AuthUser()
238 {
239 // AuthenticateResponse sessionInfo = m_gridServer.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code);
240 AuthenticateResponse sessionInfo = this.m_authenticateSessionsHandler.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code);
241 if (!sessionInfo.Authorised)
242 {
243 //session/circuit not authorised
244 MainLog.Instance.Notice("OpenSimClient.cs:AuthUser() - New user request denied to " + userEP.ToString());
245 ClientThread.Abort();
246 }
247 else
248 {
249 MainLog.Instance.Notice("OpenSimClient.cs:AuthUser() - Got authenticated connection from " + userEP.ToString());
250 //session is authorised
251 this.AgentID = cirpack.CircuitCode.ID;
252 this.SessionID = cirpack.CircuitCode.SessionID;
253 this.CircuitCode = cirpack.CircuitCode.Code;
254 this.firstName = sessionInfo.LoginInfo.First;
255 this.lastName = sessionInfo.LoginInfo.Last;
256
257 if (sessionInfo.LoginInfo.SecureSession != LLUUID.Zero)
258 {
259 this.SecureSessionID = sessionInfo.LoginInfo.SecureSession;
260 }
261 InitNewClient();
262
263 ClientLoop();
264 }
265 }
266 # endregion
267
268
269 protected override void KillThread()
270 {
271 this.ClientThread.Abort();
272 }
273
274 #region Inventory Creation
275 private void SetupInventory(AuthenticateResponse sessionInfo)
276 {
277
278 }
279 private AgentInventory CreateInventory(LLUUID baseFolder)
280 {
281 AgentInventory inventory = null;
282
283 return inventory;
284 }
285
286 private void CreateInventoryItem(CreateInventoryItemPacket packet)
287 {
288
289 }
290 #endregion
291
292 }
293}
diff --git a/OpenSim/Region/ClientStack/ClientViewBase.cs b/OpenSim/Region/ClientStack/ClientViewBase.cs
new file mode 100644
index 0000000..048f4df
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientViewBase.cs
@@ -0,0 +1,326 @@
1
2/*
3* Copyright (c) Contributors, http://www.openmetaverse.org/
4* See CONTRIBUTORS.TXT for a full list of copyright holders.
5*
6* Redistribution and use in source and binary forms, with or without
7* modification, are permitted provided that the following conditions are met:
8* * Redistributions of source code must retain the above copyright
9* notice, this list of conditions and the following disclaimer.
10* * Redistributions in binary form must reproduce the above copyright
11* notice, this list of conditions and the following disclaimer in the
12* documentation and/or other materials provided with the distribution.
13* * Neither the name of the OpenSim Project nor the
14* names of its contributors may be used to endorse or promote products
15* derived from this software without specific prior written permission.
16*
17* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
18* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
21* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*
28*/
29using System;
30using System.Collections.Generic;
31using System.Net;
32using System.Net.Sockets;
33using System.Timers;
34using libsecondlife;
35using libsecondlife.Packets;
36using OpenSim.Framework.Console;
37using OpenSim.Framework.Utilities;
38
39namespace OpenSim.Region.ClientStack
40{
41 public class ClientViewBase
42 {
43 protected BlockingQueue<QueItem> PacketQueue;
44 protected Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>();
45 protected Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>();
46
47 protected Timer AckTimer;
48 protected uint Sequence = 0;
49 protected object SequenceLock = new object();
50 protected const int MAX_APPENDED_ACKS = 10;
51 protected const int RESEND_TIMEOUT = 4000;
52 protected const int MAX_SEQUENCE = 0xFFFFFF;
53
54 public uint CircuitCode;
55 public EndPoint userEP;
56
57 protected PacketServer m_networkServer;
58
59 public ClientViewBase()
60 {
61
62 }
63
64 protected virtual void ProcessInPacket(Packet Pack)
65 {
66
67 }
68
69 protected virtual void ProcessOutPacket(Packet Pack)
70 {
71 // Keep track of when this packet was sent out
72 Pack.TickCount = Environment.TickCount;
73
74 Console.WriteLine(CircuitCode + ":OUT: " + Pack.Type.ToString());
75
76 if (!Pack.Header.Resent)
77 {
78 // Set the sequence number
79 lock (SequenceLock)
80 {
81 if (Sequence >= MAX_SEQUENCE)
82 Sequence = 1;
83 else
84 Sequence++;
85 Pack.Header.Sequence = Sequence;
86 }
87
88 if (Pack.Header.Reliable) //DIRTY HACK
89 {
90 lock (NeedAck)
91 {
92 if (!NeedAck.ContainsKey(Pack.Header.Sequence))
93 {
94 try
95 {
96 NeedAck.Add(Pack.Header.Sequence, Pack);
97 }
98 catch (Exception e) // HACKY
99 {
100 e.ToString();
101 // Ignore
102 // Seems to throw a exception here occasionally
103 // of 'duplicate key' despite being locked.
104 // !?!?!?
105 }
106 }
107 else
108 {
109 // Client.Log("Attempted to add a duplicate sequence number (" +
110 // packet.Header.Sequence + ") to the NeedAck dictionary for packet type " +
111 // packet.Type.ToString(), Helpers.LogLevel.Warning);
112 }
113 }
114
115 // Don't append ACKs to resent packets, in case that's what was causing the
116 // delivery to fail
117 if (!Pack.Header.Resent)
118 {
119 // Append any ACKs that need to be sent out to this packet
120 lock (PendingAcks)
121 {
122 if (PendingAcks.Count > 0 && PendingAcks.Count < MAX_APPENDED_ACKS &&
123 Pack.Type != PacketType.PacketAck &&
124 Pack.Type != PacketType.LogoutRequest)
125 {
126 Pack.Header.AckList = new uint[PendingAcks.Count];
127 int i = 0;
128
129 foreach (uint ack in PendingAcks.Values)
130 {
131 Pack.Header.AckList[i] = ack;
132 i++;
133 }
134
135 PendingAcks.Clear();
136 Pack.Header.AppendedAcks = true;
137 }
138 }
139 }
140 }
141 }
142
143 byte[] ZeroOutBuffer = new byte[4096];
144 byte[] sendbuffer;
145 sendbuffer = Pack.ToBytes();
146
147 try
148 {
149 if (Pack.Header.Zerocoded)
150 {
151 int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
152 m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, CircuitCode);//userEP);
153 }
154 else
155 {
156 m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, CircuitCode); //userEP);
157 }
158 }
159 catch (Exception)
160 {
161 MainLog.Instance.Warn("OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " + userEP.ToString() + " - killing thread");
162 this.KillThread();
163 }
164
165 }
166
167 public virtual void InPacket(Packet NewPack)
168 {
169 // Handle appended ACKs
170 if (NewPack.Header.AppendedAcks)
171 {
172 lock (NeedAck)
173 {
174 foreach (uint ack in NewPack.Header.AckList)
175 {
176 NeedAck.Remove(ack);
177 }
178 }
179 }
180
181 // Handle PacketAck packets
182 if (NewPack.Type == PacketType.PacketAck)
183 {
184 PacketAckPacket ackPacket = (PacketAckPacket)NewPack;
185
186 lock (NeedAck)
187 {
188 foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets)
189 {
190 NeedAck.Remove(block.ID);
191 }
192 }
193 }
194 else if ((NewPack.Type == PacketType.StartPingCheck))
195 {
196 //reply to pingcheck
197 StartPingCheckPacket startPing = (StartPingCheckPacket)NewPack;
198 CompletePingCheckPacket endPing = new CompletePingCheckPacket();
199 endPing.PingID.PingID = startPing.PingID.PingID;
200 OutPacket(endPing);
201 }
202 else
203 {
204 QueItem item = new QueItem();
205 item.Packet = NewPack;
206 item.Incoming = true;
207 this.PacketQueue.Enqueue(item);
208 }
209
210 }
211
212 public virtual void OutPacket(Packet NewPack)
213 {
214 QueItem item = new QueItem();
215 item.Packet = NewPack;
216 item.Incoming = false;
217 this.PacketQueue.Enqueue(item);
218 }
219
220 # region Low Level Packet Methods
221
222 protected void ack_pack(Packet Pack)
223 {
224 if (Pack.Header.Reliable)
225 {
226 PacketAckPacket ack_it = new PacketAckPacket();
227 ack_it.Packets = new PacketAckPacket.PacketsBlock[1];
228 ack_it.Packets[0] = new PacketAckPacket.PacketsBlock();
229 ack_it.Packets[0].ID = Pack.Header.Sequence;
230 ack_it.Header.Reliable = false;
231
232 OutPacket(ack_it);
233
234 }
235 /*
236 if (Pack.Header.Reliable)
237 {
238 lock (PendingAcks)
239 {
240 uint sequence = (uint)Pack.Header.Sequence;
241 if (!PendingAcks.ContainsKey(sequence)) { PendingAcks[sequence] = sequence; }
242 }
243 }*/
244 }
245
246 protected void ResendUnacked()
247 {
248 int now = Environment.TickCount;
249
250 lock (NeedAck)
251 {
252 foreach (Packet packet in NeedAck.Values)
253 {
254 if ((now - packet.TickCount > RESEND_TIMEOUT) && (!packet.Header.Resent))
255 {
256 MainLog.Instance.Verbose( "Resending " + packet.Type.ToString() + " packet, " +
257 (now - packet.TickCount) + "ms have passed");
258
259 packet.Header.Resent = true;
260 OutPacket(packet);
261 }
262 }
263 }
264 }
265
266 protected void SendAcks()
267 {
268 lock (PendingAcks)
269 {
270 if (PendingAcks.Count > 0)
271 {
272 if (PendingAcks.Count > 250)
273 {
274 // FIXME: Handle the odd case where we have too many pending ACKs queued up
275 MainLog.Instance.Verbose( "Too many ACKs queued up!");
276 return;
277 }
278
279 //OpenSim.Framework.Console.MainLog.Instance.WriteLine("Sending PacketAck");
280
281
282 int i = 0;
283 PacketAckPacket acks = new PacketAckPacket();
284 acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count];
285
286 foreach (uint ack in PendingAcks.Values)
287 {
288 acks.Packets[i] = new PacketAckPacket.PacketsBlock();
289 acks.Packets[i].ID = ack;
290 i++;
291 }
292
293 acks.Header.Reliable = false;
294 OutPacket(acks);
295
296 PendingAcks.Clear();
297 }
298 }
299 }
300
301 protected void AckTimer_Elapsed(object sender, ElapsedEventArgs ea)
302 {
303 SendAcks();
304 ResendUnacked();
305 }
306 #endregion
307
308 protected virtual void KillThread()
309 {
310
311 }
312
313 #region Nested Classes
314
315 public class QueItem
316 {
317 public QueItem()
318 {
319 }
320
321 public Packet Packet;
322 public bool Incoming;
323 }
324 #endregion
325 }
326}
diff --git a/OpenSim/Region/ClientStack/PacketServer.cs b/OpenSim/Region/ClientStack/PacketServer.cs
new file mode 100644
index 0000000..a88c682
--- /dev/null
+++ b/OpenSim/Region/ClientStack/PacketServer.cs
@@ -0,0 +1,184 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Collections.Generic;
29using System.Net;
30using System.Net.Sockets;
31using libsecondlife.Packets;
32using OpenSim.Assets;
33using OpenSim.Framework;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Region.Caches;
36
37namespace OpenSim.Region.ClientStack
38{
39 public class PacketServer
40 {
41 private ClientStackNetworkHandler _networkHandler;
42 private IWorld _localWorld;
43 public Dictionary<uint, ClientView> ClientThreads = new Dictionary<uint, ClientView>();
44 private ClientManager m_clientManager = new ClientManager();
45 public ClientManager ClientManager
46 {
47 get { return m_clientManager; }
48 }
49
50 public PacketServer(ClientStackNetworkHandler networkHandler)
51 {
52 _networkHandler = networkHandler;
53 _networkHandler.RegisterPacketServer(this);
54 }
55
56 public IWorld LocalWorld
57 {
58 set
59 {
60 this._localWorld = value;
61 }
62 }
63
64 /// <summary>
65 ///
66 /// </summary>
67 /// <param name="circuitCode"></param>
68 /// <param name="packet"></param>
69 public virtual void ClientInPacket(uint circuitCode, Packet packet)
70 {
71 if (this.ClientThreads.ContainsKey(circuitCode))
72 {
73 ClientThreads[circuitCode].InPacket(packet);
74 }
75 }
76
77 /// <summary>
78 ///
79 /// </summary>
80 /// <param name="circuitCode"></param>
81 /// <returns></returns>
82 public virtual bool AddNewCircuitCodeClient(uint circuitCode)
83 {
84 return false;
85 }
86
87 /// <summary>
88 ///
89 /// </summary>
90 /// <param name="packet"></param>
91 public virtual void SendPacketToAllClients(Packet packet)
92 {
93
94 }
95
96 /// <summary>
97 ///
98 /// </summary>
99 /// <param name="packet"></param>
100 /// <param name="simClient"></param>
101 public virtual void SendPacketToAllExcept(Packet packet, ClientView simClient)
102 {
103
104 }
105
106 /// <summary>
107 ///
108 /// </summary>
109 /// <param name="packetType"></param>
110 /// <param name="handler"></param>
111 public virtual void AddClientPacketHandler(PacketType packetType, PacketMethod handler)
112 {
113
114 }
115
116 /// <summary>
117 ///
118 /// </summary>
119 public virtual void RegisterClientPacketHandlers()
120 {
121
122 }
123
124 /// <summary>
125 ///
126 /// </summary>
127 /// <param name="remoteEP"></param>
128 /// <param name="initialcirpack"></param>
129 /// <param name="clientThreads"></param>
130 /// <param name="world"></param>
131 /// <param name="assetCache"></param>
132 /// <param name="packServer"></param>
133 /// <param name="inventoryCache"></param>
134 /// <param name="authenSessions"></param>
135 /// <returns></returns>
136 protected virtual ClientView CreateNewClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary<uint, ClientView> clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions)
137 {
138 return new ClientView(remoteEP, initialcirpack, clientThreads, world, assetCache, packServer, inventoryCache, authenSessions );
139 }
140
141 /// <summary>
142 ///
143 /// </summary>
144 /// <param name="epSender"></param>
145 /// <param name="useCircuit"></param>
146 /// <param name="assetCache"></param>
147 /// <param name="inventoryCache"></param>
148 /// <param name="authenticateSessionsClass"></param>
149 /// <returns></returns>
150 public virtual bool AddNewClient(EndPoint epSender, UseCircuitCodePacket useCircuit, AssetCache assetCache, InventoryCache inventoryCache, AuthenticateSessionsBase authenticateSessionsClass)
151 {
152 ClientView newuser =
153 CreateNewClient(epSender, useCircuit, ClientThreads, _localWorld, assetCache, this, inventoryCache,
154 authenticateSessionsClass);
155
156 this.ClientThreads.Add(useCircuit.CircuitCode.Code, newuser);
157 this.m_clientManager.Add(useCircuit.CircuitCode.Code, (IClientAPI)newuser);
158
159 return true;
160 }
161
162 /// <summary>
163 ///
164 /// </summary>
165 /// <param name="buffer"></param>
166 /// <param name="size"></param>
167 /// <param name="flags"></param>
168 /// <param name="circuitcode"></param>
169 public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)
170 {
171 this._networkHandler.SendPacketTo(buffer, size, flags, circuitcode);
172 }
173
174 /// <summary>
175 ///
176 /// </summary>
177 /// <param name="circuitcode"></param>
178 public virtual void RemoveClientCircuit(uint circuitcode)
179 {
180 this._networkHandler.RemoveClientCircuit(circuitcode);
181 this.m_clientManager.Remove(circuitcode);
182 }
183 }
184}
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
new file mode 100644
index 0000000..1e99c71
--- /dev/null
+++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
@@ -0,0 +1,117 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Net;
31using OpenSim.Assets;
32using OpenSim.Framework;
33using OpenSim.Framework.Console;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Servers;
36using OpenSim.Framework.Types;
37using OpenSim.Physics.Manager;
38using OpenSim.Region.Caches;
39
40namespace OpenSim.Region.ClientStack
41{
42 public class RegionApplicationBase
43 {
44 protected IGenericConfig localConfig;
45 protected PhysicsManager physManager;
46 protected AssetCache AssetCache;
47 protected InventoryCache InventoryCache;
48 protected Dictionary<EndPoint, uint> clientCircuits = new Dictionary<EndPoint, uint>();
49 protected DateTime startuptime;
50 protected NetworkServersInfo serversData;
51
52 public string m_physicsEngine;
53 public bool m_sandbox = false;
54 public bool m_loginserver;
55 public bool user_accounts = false;
56 public bool gridLocalAsset = false;
57 protected bool configFileSetup = false;
58 public string m_config;
59
60 protected List<UDPServer> m_udpServer = new List<UDPServer>();
61 protected List<RegionInfo> regionData = new List<RegionInfo>();
62 protected List<IWorld> m_localWorld = new List<IWorld>();
63 protected BaseHttpServer httpServer;
64 protected List<AuthenticateSessionsBase> AuthenticateSessionsHandler = new List<AuthenticateSessionsBase>();
65
66 protected LogBase m_log;
67
68 public RegionApplicationBase()
69 {
70
71 }
72
73 public RegionApplicationBase(bool sandBoxMode, bool startLoginServer, string physicsEngine, bool useConfigFile, bool silent, string configFile)
74 {
75 this.configFileSetup = useConfigFile;
76 m_sandbox = sandBoxMode;
77 m_loginserver = startLoginServer;
78 m_physicsEngine = physicsEngine;
79 m_config = configFile;
80 }
81
82 /*protected World m_localWorld;
83 public World LocalWorld
84 {
85 get { return m_localWorld; }
86 }*/
87
88 /// <summary>
89 /// Performs initialisation of the world, such as loading configuration from disk.
90 /// </summary>
91 public virtual void StartUp()
92 {
93 }
94
95 protected virtual void SetupLocalGridServers()
96 {
97 }
98
99 protected virtual void SetupRemoteGridServers()
100 {
101
102 }
103
104 protected virtual void SetupWorld()
105 {
106 }
107
108 protected virtual void SetupHttpListener()
109 {
110 }
111
112 protected virtual void ConnectToRemoteGridServer()
113 {
114
115 }
116 }
117}
diff --git a/OpenSim/Region/ClientStack/UDPServer.cs b/OpenSim/Region/ClientStack/UDPServer.cs
new file mode 100644
index 0000000..6eea524
--- /dev/null
+++ b/OpenSim/Region/ClientStack/UDPServer.cs
@@ -0,0 +1,196 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Net;
31using System.Net.Sockets;
32using libsecondlife.Packets;
33using OpenSim.Assets;
34using OpenSim.Framework;
35using OpenSim.Framework.Console;
36using OpenSim.Framework.Interfaces;
37using OpenSim.Region.Caches;
38
39namespace OpenSim.Region.ClientStack
40{
41
42 public class UDPServer : ClientStackNetworkHandler
43 {
44 protected Dictionary<EndPoint, uint> clientCircuits = new Dictionary<EndPoint, uint>();
45 public Socket Server;
46 protected IPEndPoint ServerIncoming;
47 protected byte[] RecvBuffer = new byte[4096];
48 protected byte[] ZeroBuffer = new byte[8192];
49 protected IPEndPoint ipeSender;
50 protected EndPoint epSender;
51 protected AsyncCallback ReceivedData;
52 protected PacketServer _packetServer;
53
54 protected int listenPort;
55 protected IWorld m_localWorld;
56 protected AssetCache m_assetCache;
57 protected InventoryCache m_inventoryCache;
58 protected LogBase m_log;
59 protected AuthenticateSessionsBase m_authenticateSessionsClass;
60
61 public PacketServer PacketServer
62 {
63 get
64 {
65 return _packetServer;
66 }
67 set
68 {
69 _packetServer = value;
70 }
71 }
72
73 public IWorld LocalWorld
74 {
75 set
76 {
77 this.m_localWorld = value;
78 this._packetServer.LocalWorld = this.m_localWorld;
79 }
80 }
81
82 public UDPServer()
83 {
84 }
85
86 public UDPServer(int port, AssetCache assetCache, InventoryCache inventoryCache, LogBase console, AuthenticateSessionsBase authenticateClass)
87 {
88 listenPort = port;
89 this.m_assetCache = assetCache;
90 this.m_inventoryCache = inventoryCache;
91 this.m_log = console;
92 this.m_authenticateSessionsClass = authenticateClass;
93 this.CreatePacketServer();
94
95 }
96
97 protected virtual void CreatePacketServer()
98 {
99 PacketServer packetServer = new PacketServer(this);
100 }
101
102 protected virtual void OnReceivedData(IAsyncResult result)
103 {
104 ipeSender = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
105 epSender = (EndPoint)ipeSender;
106 Packet packet = null;
107 int numBytes = Server.EndReceiveFrom(result, ref epSender);
108 int packetEnd = numBytes - 1;
109
110 packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
111
112 // do we already have a circuit for this endpoint
113 if (this.clientCircuits.ContainsKey(epSender))
114 {
115 //if so then send packet to the packetserver
116 this._packetServer.ClientInPacket(this.clientCircuits[epSender], packet);
117 }
118 else if (packet.Type == PacketType.UseCircuitCode)
119 {
120 // new client
121 this.AddNewClient(packet);
122 }
123 else
124 { // invalid client
125 m_log.Warn("UDPServer.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
126 }
127
128 Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
129 }
130
131 protected virtual void AddNewClient(Packet packet)
132 {
133 UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet;
134 this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
135
136 this.PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_inventoryCache, m_authenticateSessionsClass);
137 }
138
139 public void ServerListener()
140 {
141 m_log.Status("UDPServer.cs:ServerListener() - Opening UDP socket on " + listenPort);
142
143 ServerIncoming = new IPEndPoint(IPAddress.Parse("0.0.0.0"), listenPort);
144 Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
145 Server.Bind(ServerIncoming);
146
147 m_log.Verbose("UDPServer.cs:ServerListener() - UDP socket bound, getting ready to listen");
148
149 ipeSender = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
150 epSender = (EndPoint)ipeSender;
151 ReceivedData = new AsyncCallback(this.OnReceivedData);
152 Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
153
154 m_log.Verbose("UDPServer.cs:ServerListener() - Listening...");
155
156 }
157
158 public virtual void RegisterPacketServer(PacketServer server)
159 {
160 this._packetServer = server;
161 }
162
163 public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)//EndPoint packetSender)
164 {
165 // find the endpoint for this circuit
166 EndPoint sendto = null;
167 foreach (KeyValuePair<EndPoint, uint> p in this.clientCircuits)
168 {
169 if (p.Value == circuitcode)
170 {
171 sendto = p.Key;
172 break;
173 }
174 }
175 if (sendto != null)
176 {
177 //we found the endpoint so send the packet to it
178 this.Server.SendTo(buffer, size, flags, sendto);
179 }
180 }
181
182 public virtual void RemoveClientCircuit(uint circuitcode)
183 {
184 foreach (KeyValuePair<EndPoint, uint> p in this.clientCircuits)
185 {
186 if (p.Value == circuitcode)
187 {
188 this.clientCircuits.Remove(p.Key);
189 break;
190 }
191 }
192 }
193
194
195 }
196} \ No newline at end of file
diff --git a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs
new file mode 100644
index 0000000..a047843
--- /dev/null
+++ b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs
@@ -0,0 +1,54 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using OpenSim.Framework.Communications;
29using OpenSim.Framework.Types;
30using OpenSim.Framework.Servers;
31
32namespace OpenSim.Region.Communications.Local
33{
34 public class CommunicationsLocal : CommunicationsManager
35 {
36 public LocalBackEndServices SandBoxServices = new LocalBackEndServices();
37 public LocalUserServices UserServices;
38
39 public CommunicationsLocal(NetworkServersInfo serversInfo, BaseHttpServer httpServer )
40 : base(serversInfo, httpServer)
41 {
42 UserServices = new LocalUserServices(this, serversInfo);
43 UserServices.AddPlugin("OpenSim.Framework.Data.DB4o.dll");
44 UserServer = UserServices;
45 GridServer = SandBoxServices;
46 InterRegion = SandBoxServices;
47 }
48
49 internal void InformRegionOfLogin(ulong regionHandle, Login login)
50 {
51 this.SandBoxServices.AddNewSession(regionHandle, login);
52 }
53 }
54}
diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
new file mode 100644
index 0000000..d0cd991
--- /dev/null
+++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
@@ -0,0 +1,206 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Collections.Generic;
29using libsecondlife;
30using OpenSim.Framework;
31using OpenSim.Framework.Communications;
32using OpenSim.Framework.Types;
33
34namespace OpenSim.Region.Communications.Local
35{
36
37 public class LocalBackEndServices : IGridServices, IInterRegionCommunications
38 {
39 protected Dictionary<ulong, RegionInfo> regions = new Dictionary<ulong, RegionInfo>();
40 protected Dictionary<ulong, RegionCommsListener> regionHosts = new Dictionary<ulong, RegionCommsListener>();
41
42 public LocalBackEndServices()
43 {
44
45 }
46
47 /// <summary>
48 /// Register a region method with the BackEnd Services.
49 /// </summary>
50 /// <param name="regionInfo"></param>
51 /// <returns></returns>
52 public RegionCommsListener RegisterRegion(RegionInfo regionInfo)
53 {
54 //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering");
55 if (!this.regions.ContainsKey((uint)regionInfo.RegionHandle))
56 {
57 //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle );
58 this.regions.Add(regionInfo.RegionHandle, regionInfo);
59 RegionCommsListener regionHost = new RegionCommsListener();
60 this.regionHosts.Add(regionInfo.RegionHandle, regionHost);
61
62 return regionHost;
63 }
64
65 //already in our list of regions so for now lets return null
66 return null;
67 }
68
69 /// <summary>
70 /// </summary>
71 /// <param name="regionInfo"></param>
72 /// <returns></returns>
73 public List<RegionInfo> RequestNeighbours(RegionInfo regionInfo)
74 {
75 // Console.WriteLine("Finding Neighbours to " + regionInfo.RegionHandle);
76 List<RegionInfo> neighbours = new List<RegionInfo>();
77
78 foreach (RegionInfo reg in this.regions.Values)
79 {
80 // Console.WriteLine("CommsManager- RequestNeighbours() checking region " + reg.RegionLocX + " , "+ reg.RegionLocY);
81 if (reg.RegionHandle != regionInfo.RegionHandle)
82 {
83 //Console.WriteLine("CommsManager- RequestNeighbours() - found a different region in list, checking location");
84 if ((reg.RegionLocX > (regionInfo.RegionLocX - 2)) && (reg.RegionLocX < (regionInfo.RegionLocX + 2)))
85 {
86 if ((reg.RegionLocY > (regionInfo.RegionLocY - 2)) && (reg.RegionLocY < (regionInfo.RegionLocY + 2)))
87 {
88 neighbours.Add(reg);
89 }
90 }
91 }
92 }
93 return neighbours;
94 }
95
96 /// <summary>
97 ///
98 /// </summary>
99 /// <param name="regionHandle"></param>
100 /// <returns></returns>
101 public RegionInfo RequestNeighbourInfo(ulong regionHandle)
102 {
103 if (this.regions.ContainsKey(regionHandle))
104 {
105 return this.regions[regionHandle];
106 }
107 return null;
108 }
109
110 /// <summary>
111 ///
112 /// </summary>
113 /// <param name="minX"></param>
114 /// <param name="minY"></param>
115 /// <param name="maxX"></param>
116 /// <param name="maxY"></param>
117 /// <returns></returns>
118 public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
119 {
120 List<MapBlockData> mapBlocks = new List<MapBlockData>();
121 foreach(RegionInfo regInfo in this.regions.Values)
122 {
123 if (((regInfo.RegionLocX >= minX) && (regInfo.RegionLocX <= maxX)) && ((regInfo.RegionLocY >= minY) && (regInfo.RegionLocY <= maxY)))
124 {
125 MapBlockData map = new MapBlockData();
126 map.Name = regInfo.RegionName;
127 map.X = (ushort)regInfo.RegionLocX;
128 map.Y = (ushort)regInfo.RegionLocY;
129 map.WaterHeight =(byte) regInfo.estateSettings.waterHeight;
130 map.MapImageId = regInfo.estateSettings.terrainImageID; //new LLUUID("00000000-0000-0000-9999-000000000007");
131 map.Agents = 1;
132 map.RegionFlags = 72458694;
133 map.Access = 13;
134 mapBlocks.Add(map);
135 }
136 }
137 return mapBlocks;
138 }
139
140 /// <summary>
141 /// </summary>
142 /// <param name="regionHandle"></param>
143 /// <param name="agentData"></param>
144 /// <returns></returns>
145 public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) //should change from agentCircuitData
146 {
147 //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent");
148 if (this.regionHosts.ContainsKey(regionHandle))
149 {
150 // Console.WriteLine("CommsManager- Informing a region to expect child agent");
151 this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agentData);
152 return true;
153 }
154 return false;
155 }
156
157 /// <summary>
158 ///
159 /// </summary>
160 /// <param name="regionHandle"></param>
161 /// <param name="agentID"></param>
162 /// <param name="position"></param>
163 /// <returns></returns>
164 public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position)
165 {
166 if (this.regionHosts.ContainsKey(regionHandle))
167 {
168 // Console.WriteLine("CommsManager- Informing a region to expect avatar crossing");
169 this.regionHosts[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position);
170 return true;
171 }
172 return false;
173 }
174
175 /// <summary>
176 /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session
177 /// </summary>
178 /// <param name="regionHandle"></param>
179 /// <param name="loginData"></param>
180 /// <returns></returns>
181 public bool AddNewSession(ulong regionHandle, Login loginData)
182 {
183 AgentCircuitData agent = new AgentCircuitData();
184 agent.AgentID = loginData.Agent;
185 agent.firstname = loginData.First;
186 agent.lastname = loginData.Last;
187 agent.SessionID = loginData.Session;
188 agent.SecureSessionID = loginData.SecureSession;
189 agent.circuitcode = loginData.CircuitCode;
190 agent.BaseFolder = loginData.BaseFolder;
191 agent.InventoryFolder = loginData.InventoryFolder;
192 agent.startpos = new LLVector3(128, 128, 70);
193 agent.CapsPath = loginData.CapsPath;
194
195 if (this.regionHosts.ContainsKey(regionHandle))
196 {
197 this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agent);
198 return true;
199 }
200
201 // region not found
202 return false;
203 }
204 }
205}
206
diff --git a/OpenSim/Region/Communications/Local/LocalUserServices.cs b/OpenSim/Region/Communications/Local/LocalUserServices.cs
new file mode 100644
index 0000000..592b36c
--- /dev/null
+++ b/OpenSim/Region/Communications/Local/LocalUserServices.cs
@@ -0,0 +1,142 @@
1using System;
2using libsecondlife;
3using OpenSim.Framework.Communications;
4using OpenSim.Framework.Data;
5using OpenSim.Framework.Types;
6using OpenSim.Framework.UserManagement;
7using OpenSim.Framework.Utilities;
8
9namespace OpenSim.Region.Communications.Local
10{
11 public class LocalUserServices : UserManagerBase, IUserServices
12 {
13 private CommunicationsLocal m_Parent;
14
15 private NetworkServersInfo serversInfo;
16 private uint defaultHomeX ;
17 private uint defaultHomeY;
18 public LocalUserServices(CommunicationsLocal parent, NetworkServersInfo serversData)
19 {
20 m_Parent = parent;
21 this.serversInfo = serversData;
22 defaultHomeX = this.serversInfo.DefaultHomeLocX;
23 defaultHomeY = this.serversInfo.DefaultHomeLocY;
24 }
25
26 public UserProfileData GetUserProfile(string firstName, string lastName)
27 {
28 return GetUserProfile(firstName + " " + lastName);
29 }
30
31 public UserProfileData GetUserProfile(string name)
32 {
33 return this.getUserProfile(name);
34 }
35
36 public UserProfileData GetUserProfile(LLUUID avatarID)
37 {
38 return this.getUserProfile(avatarID);
39 }
40
41 /// <summary>
42 ///
43 /// </summary>
44 /// <returns></returns>
45 public override string GetMessage()
46 {
47 return "Welcome to OpenSim";
48 }
49
50 public override UserProfileData GetTheUser(string firstname, string lastname)
51 {
52 UserProfileData profile = getUserProfile(firstname, lastname);
53 if (profile != null)
54 {
55
56 return profile;
57 }
58
59 //no current user account so make one
60 Console.WriteLine("No User account found so creating a new one ");
61 this.AddUserProfile(firstname, lastname, "test", defaultHomeX, defaultHomeY);
62
63 profile = getUserProfile(firstname, lastname);
64
65 return profile;
66 }
67
68 public override bool AuthenticateUser(UserProfileData profile, string password)
69 {
70 //for now we will accept any password in sandbox mode
71 Console.WriteLine("authorising user");
72 return true;
73 }
74
75 public override void CustomiseResponse(LoginResponse response, UserProfileData theUser)
76 {
77 ulong currentRegion = theUser.currentAgent.currentHandle;
78 RegionInfo reg = m_Parent.GridServer.RequestNeighbourInfo(currentRegion);
79
80 if (reg != null)
81 {
82 response.Home = "{'region_handle':[r" + (reg.RegionLocX * 256).ToString() + ",r" + (reg.RegionLocY * 256).ToString() + "], " +
83 "'position':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "], " +
84 "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}";
85 string capsPath = Util.GetRandomCapsPath();
86 response.SimAddress = reg.ExternalEndPoint.Address.ToString();
87 response.SimPort = (Int32)reg.ExternalEndPoint.Port;
88 response.RegionX = reg.RegionLocX ;
89 response.RegionY = reg.RegionLocY ;
90
91 //following port needs changing as we don't want a http listener for every region (or do we?)
92 response.SeedCapability = "http://" + reg.ExternalHostName + ":" + this.serversInfo.HttpListenerPort.ToString() + "/CAPS/" + capsPath + "0000/";
93 theUser.currentAgent.currentRegion = reg.SimUUID;
94 theUser.currentAgent.currentHandle = reg.RegionHandle;
95
96 Login _login = new Login();
97 //copy data to login object
98 _login.First = response.Firstname;
99 _login.Last = response.Lastname;
100 _login.Agent = response.AgentID;
101 _login.Session = response.SessionID;
102 _login.SecureSession = response.SecureSessionID;
103 _login.CircuitCode = (uint)response.CircuitCode;
104 _login.CapsPath = capsPath;
105
106 m_Parent.InformRegionOfLogin(currentRegion, _login);
107 }
108 else
109 {
110 Console.WriteLine("not found region " + currentRegion);
111 }
112
113 }
114
115 public UserProfileData SetupMasterUser(string firstName, string lastName)
116 {
117 return SetupMasterUser(firstName, lastName, "");
118 }
119
120 public UserProfileData SetupMasterUser(string firstName, string lastName, string password)
121 {
122 UserProfileData profile = getUserProfile(firstName, lastName);
123 if (profile != null)
124 {
125
126 return profile;
127 }
128
129 Console.WriteLine("Unknown Master User. Sandbox Mode: Creating Account");
130 this.AddUserProfile(firstName, lastName, password, defaultHomeX, defaultHomeY);
131
132 profile = getUserProfile(firstName, lastName);
133
134 if (profile == null)
135 {
136 Console.WriteLine("Unknown Master User after creation attempt. No clue what to do here.");
137 }
138
139 return profile;
140 }
141 }
142}
diff --git a/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9afb75e
--- /dev/null
+++ b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
1using System.Reflection;
2using System.Runtime.InteropServices;
3// General Information about an assembly is controlled through the following
4// set of attributes. Change these attribute values to modify the information
5// associated with an assembly.
6[assembly: AssemblyTitle("OpenSim.Region.Communications.Local")]
7[assembly: AssemblyDescription("")]
8[assembly: AssemblyConfiguration("")]
9[assembly: AssemblyCompany("")]
10[assembly: AssemblyProduct("OpenSim.Region.Communications.Local")]
11[assembly: AssemblyCopyright("Copyright © 2007")]
12[assembly: AssemblyTrademark("")]
13[assembly: AssemblyCulture("")]
14
15// Setting ComVisible to false makes the types in this assembly not visible
16// to COM components. If you need to access a type in this assembly from
17// COM, set the ComVisible attribute to true on that type.
18[assembly: ComVisible(false)]
19
20// The following GUID is for the ID of the typelib if this project is exposed to COM
21[assembly: Guid("fb173926-bd0a-4cd0-bb45-185b2f72ddfb")]
22
23// Version information for an assembly consists of the following four values:
24//
25// Major Version
26// Minor Version
27// Build Number
28// Revision
29//
30// You can specify all the values or you can default the Revision and Build Numbers
31// by using the '*' as shown below:
32[assembly: AssemblyVersion("1.0.0.0")]
33[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs
new file mode 100644
index 0000000..cc05845
--- /dev/null
+++ b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs
@@ -0,0 +1,18 @@
1using OpenSim.Framework.Communications;
2using OpenSim.Framework.Types;
3using OpenSim.Framework.Servers;
4
5namespace OpenSim.Region.Communications.OGS1
6{
7 public class CommunicationsOGS1 : CommunicationsManager
8 {
9
10 public CommunicationsOGS1(NetworkServersInfo serversInfo, BaseHttpServer httpServer ) :base(serversInfo, httpServer)
11 {
12 OGS1GridServices gridInterComms = new OGS1GridServices(serversInfo, httpServer);
13 GridServer = gridInterComms;
14 InterRegion = gridInterComms;
15 UserServer = new OGS1UserServices(this);
16 }
17 }
18}
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
new file mode 100644
index 0000000..66c1739
--- /dev/null
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -0,0 +1,378 @@
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Net;
5using System.Runtime.Remoting;
6using System.Runtime.Remoting.Channels;
7using System.Runtime.Remoting.Channels.Tcp;
8using libsecondlife;
9using Nwc.XmlRpc;
10using OpenSim.Framework;
11using OpenSim.Framework.Communications;
12using OpenSim.Framework.Console;
13using OpenSim.Framework.Servers;
14using OpenSim.Framework.Types;
15
16namespace OpenSim.Region.Communications.OGS1
17{
18 public class OGS1GridServices : IGridServices, IInterRegionCommunications
19 {
20 public Dictionary<ulong, RegionCommsListener> listeners = new Dictionary<ulong, RegionCommsListener>();
21 protected Dictionary<ulong, RegionInfo> regions = new Dictionary<ulong, RegionInfo>();
22
23 public BaseHttpServer httpListener;
24 public NetworkServersInfo serversInfo;
25 public BaseHttpServer httpServer;
26
27 public OGS1GridServices(NetworkServersInfo servers_info, BaseHttpServer httpServe)
28 {
29 serversInfo = servers_info;
30 httpServer = httpServe;
31 httpServer.AddXmlRPCHandler("expect_user", this.ExpectUser);
32 this.StartRemoting();
33 }
34
35 public RegionCommsListener RegisterRegion(RegionInfo regionInfo)
36 {
37 if (!this.regions.ContainsKey((uint)regionInfo.RegionHandle))
38 {
39 this.regions.Add(regionInfo.RegionHandle, regionInfo);
40 }
41
42 Hashtable GridParams = new Hashtable();
43
44
45 // Login / Authentication
46
47 GridParams["authkey"] = serversInfo.GridSendKey;
48 GridParams["UUID"] = regionInfo.SimUUID.ToStringHyphenated();
49 GridParams["sim_ip"] = regionInfo.ExternalHostName;
50 GridParams["sim_port"] = regionInfo.InternalEndPoint.Port.ToString();
51 GridParams["region_locx"] = regionInfo.RegionLocX.ToString();
52 GridParams["region_locy"] = regionInfo.RegionLocY.ToString();
53 GridParams["sim_name"] = regionInfo.RegionName;
54 GridParams["http_port"] = serversInfo.HttpListenerPort.ToString();
55 GridParams["remoting_port"] = serversInfo.RemotingListenerPort.ToString();
56 GridParams["map-image-id"] = regionInfo.estateSettings.terrainImageID.ToStringHyphenated();
57
58 // Package into an XMLRPC Request
59 ArrayList SendParams = new ArrayList();
60 SendParams.Add(GridParams);
61
62 // Send Request
63 XmlRpcRequest GridReq = new XmlRpcRequest("simulator_login", SendParams);
64 XmlRpcResponse GridResp = GridReq.Send(serversInfo.GridURL, 3000);
65 Hashtable GridRespData = (Hashtable)GridResp.Value;
66
67 Hashtable griddatahash = GridRespData;
68
69 // Process Response
70 if (GridRespData.ContainsKey("error"))
71 {
72 string errorstring = (string)GridRespData["error"];
73 MainLog.Instance.Error("Unable to connect to grid: " + errorstring);
74 return null;
75 }
76
77 /* if (!this.listeners.ContainsKey(regionInfo.RegionHandle))
78 {
79 MainLog.Instance.Verbose("OGS1 - Registering new HTTP listener on port " + regionInfo.InternalEndPoint.Port.ToString());
80 // initialised = true;
81 httpListener = new BaseHttpServer( regionInfo.InternalEndPoint.Port );
82 httpListener.AddXmlRPCHandler("expect_user", this.ExpectUser);
83 httpListener.Start();
84 }*/
85
86 // Initialise the background listeners
87 RegionCommsListener regListener = new RegionCommsListener();
88 if (this.listeners.ContainsKey(regionInfo.RegionHandle))
89 {
90 this.listeners.Add(regionInfo.RegionHandle, regListener);
91 }
92 else
93 {
94 listeners[regionInfo.RegionHandle] = regListener;
95 }
96
97 return regListener;
98 }
99
100 public List<RegionInfo> RequestNeighbours(RegionInfo regionInfo)
101 {
102
103 Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1);
104
105 List<RegionInfo> neighbours = new List<RegionInfo>();
106
107 foreach (ArrayList a in respData.Values)
108 {
109 foreach (Hashtable n in a)
110 {
111 uint regX = Convert.ToUInt32(n["x"]);
112 uint regY = Convert.ToUInt32(n["y"]);
113 if ((regionInfo.RegionLocX != regX) || (regionInfo.RegionLocY != regY))
114 {
115 string internalIpStr = (string)n["sim_ip"];
116 uint port = Convert.ToUInt32(n["sim_port"]);
117 string externalUri = (string)n["sim_uri"];
118
119 IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int)port);
120 string neighbourExternalUri = externalUri;
121 RegionInfo neighbour = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr);
122
123 //OGS1
124 //neighbour.RegionHandle = (ulong)n["regionhandle"]; is now calculated locally
125
126 neighbour.RegionName = (string)n["name"];
127
128 //OGS1+
129 neighbour.SimUUID = (string)n["uuid"];
130
131 neighbours.Add(neighbour);
132 }
133 }
134 }
135
136 return neighbours;
137 }
138
139 public RegionInfo RequestNeighbourInfo(ulong regionHandle)
140 {
141 if (this.regions.ContainsKey(regionHandle))
142 {
143 return this.regions[regionHandle];
144 }
145 //TODO not a region in this instance so ask remote grid server
146
147 Hashtable requestData = new Hashtable();
148 requestData["region_handle"] = regionHandle.ToString();
149 requestData["authkey"] = this.serversInfo.GridSendKey;
150 ArrayList SendParams = new ArrayList();
151 SendParams.Add(requestData);
152 XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams);
153 XmlRpcResponse GridResp = GridReq.Send(this.serversInfo.GridURL, 3000);
154
155 Hashtable responseData = (Hashtable)GridResp.Value;
156
157 if (responseData.ContainsKey("error"))
158 {
159 Console.WriteLine("error received from grid server" + responseData["error"]);
160 return null;
161 }
162
163 uint regX = Convert.ToUInt32((string)responseData["region_locx"]);
164 uint regY = Convert.ToUInt32((string)responseData["region_locy"]);
165 string internalIpStr = (string)responseData["sim_ip"];
166 uint port = Convert.ToUInt32(responseData["sim_port"]);
167 string externalUri = (string)responseData["sim_uri"];
168
169 IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int)port);
170 string neighbourExternalUri = externalUri;
171 RegionInfo regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr);
172
173 regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]);
174 regionInfo.RemotingAddress = internalIpStr;
175
176 regionInfo.SimUUID = new LLUUID((string)responseData["region_UUID"]);
177 regionInfo.RegionName = (string)responseData["region_name"];
178
179 return regionInfo;
180 }
181
182 public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
183 {
184 Hashtable respData = MapBlockQuery(minX, minY, maxX, maxY);
185
186 List<MapBlockData> neighbours = new List<MapBlockData>();
187
188 foreach (ArrayList a in respData.Values)
189 {
190 foreach (Hashtable n in a)
191 {
192 MapBlockData neighbour = new MapBlockData();
193
194 neighbour.X = Convert.ToUInt16(n["x"]);
195 neighbour.Y = Convert.ToUInt16(n["y"]);
196
197 neighbour.Name = (string)n["name"];
198 neighbour.Access = Convert.ToByte(n["access"]);
199 neighbour.RegionFlags = Convert.ToUInt32(n["region-flags"]);
200 neighbour.WaterHeight = Convert.ToByte(n["water-height"]);
201 neighbour.MapImageId = new LLUUID((string)n["map-image-id"]);
202
203 neighbours.Add(neighbour);
204 }
205 }
206
207 return neighbours;
208 }
209
210 /// <summary>
211 /// Performs a XML-RPC query against the grid server returning mapblock information in the specified coordinates
212 /// </summary>
213 /// <remarks>REDUNDANT - OGS1 is to be phased out in favour of OGS2</remarks>
214 /// <param name="minX">Minimum X value</param>
215 /// <param name="minY">Minimum Y value</param>
216 /// <param name="maxX">Maximum X value</param>
217 /// <param name="maxY">Maximum Y value</param>
218 /// <returns>Hashtable of hashtables containing map data elements</returns>
219 private Hashtable MapBlockQuery(int minX, int minY, int maxX, int maxY)
220 {
221 Hashtable param = new Hashtable();
222 param["xmin"] = minX;
223 param["ymin"] = minY;
224 param["xmax"] = maxX;
225 param["ymax"] = maxY;
226 IList parameters = new ArrayList();
227 parameters.Add(param);
228 XmlRpcRequest req = new XmlRpcRequest("map_block", parameters);
229 XmlRpcResponse resp = req.Send(serversInfo.GridURL, 3000);
230 Hashtable respData = (Hashtable)resp.Value;
231 return respData;
232 }
233
234 // Grid Request Processing
235 public XmlRpcResponse ExpectUser(XmlRpcRequest request)
236 {
237 Console.WriteLine("Expecting User...");
238 Hashtable requestData = (Hashtable)request.Params[0];
239 AgentCircuitData agentData = new AgentCircuitData();
240 agentData.SessionID = new LLUUID((string)requestData["session_id"]);
241 agentData.SecureSessionID = new LLUUID((string)requestData["secure_session_id"]);
242 agentData.firstname = (string)requestData["firstname"];
243 agentData.lastname = (string)requestData["lastname"];
244 agentData.AgentID = new LLUUID((string)requestData["agent_id"]);
245 agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
246 if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1"))
247 {
248 agentData.child = true;
249 }
250 else
251 {
252 agentData.startpos = new LLVector3(Convert.ToUInt32(requestData["startpos_x"]), Convert.ToUInt32(requestData["startpos_y"]), Convert.ToUInt32(requestData["startpos_z"]));
253 agentData.child = false;
254
255 }
256
257 if (listeners.ContainsKey(Convert.ToUInt64((string)requestData["regionhandle"])))
258 {
259 this.listeners[Convert.ToUInt64((string)requestData["regionhandle"])].TriggerExpectUser(Convert.ToUInt64((string)requestData["regionhandle"]), agentData);
260 }
261 else
262 {
263 MainLog.Instance.Error("ExpectUser() - Unknown region " + ((ulong)requestData["regionhandle"]).ToString());
264 }
265
266 MainLog.Instance.Verbose("ExpectUser() - Welcoming new user...");
267
268 return new XmlRpcResponse();
269 }
270
271 #region InterRegion Comms
272 private void StartRemoting()
273 {
274 TcpChannel ch = new TcpChannel(this.serversInfo.RemotingListenerPort);
275 ChannelServices.RegisterChannel(ch, true);
276
277 WellKnownServiceTypeEntry wellType = new WellKnownServiceTypeEntry(typeof(OGS1InterRegionRemoting), "InterRegions", WellKnownObjectMode.Singleton);
278 RemotingConfiguration.RegisterWellKnownServiceType(wellType);
279 InterRegionSingleton.Instance.OnArrival += this.IncomingArrival;
280 InterRegionSingleton.Instance.OnChildAgent += this.IncomingChildAgent;
281 }
282
283 #region Methods called by regions in this instance
284 public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData)
285 {
286 if (this.listeners.ContainsKey(regionHandle))
287 {
288 this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData);
289 return true;
290 }
291 RegionInfo regInfo = this.RequestNeighbourInfo(regionHandle);
292 if (regInfo != null)
293 {
294 //don't want to be creating a new link to the remote instance every time like we are here
295 bool retValue = false;
296
297
298 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
299 typeof(OGS1InterRegionRemoting),
300 "tcp://"+ regInfo.RemotingAddress+":"+regInfo.RemotingPort+"/InterRegions");
301 if (remObject != null)
302 {
303
304 retValue = remObject.InformRegionOfChildAgent(regionHandle, agentData);
305 }
306 else
307 {
308 Console.WriteLine("remoting object not found");
309 }
310 remObject = null;
311
312
313 return retValue;
314 }
315
316 return false;
317 }
318
319 public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position)
320 {
321 if (this.listeners.ContainsKey(regionHandle))
322 {
323 this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position);
324 return true;
325 }
326 RegionInfo regInfo = this.RequestNeighbourInfo(regionHandle);
327 if (regInfo != null)
328 {
329 bool retValue = false;
330
331
332 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
333 typeof(OGS1InterRegionRemoting),
334 "tcp://" + regInfo.RemotingAddress + ":" + regInfo.RemotingPort + "/InterRegions");
335 if (remObject != null)
336 {
337
338 retValue = remObject.ExpectAvatarCrossing(regionHandle, agentID, position);
339 }
340 else
341 {
342 Console.WriteLine("remoting object not found");
343 }
344 remObject = null;
345
346
347 return retValue;
348 }
349 //TODO need to see if we know about where this region is and use .net remoting
350 // to inform it.
351 return false;
352 }
353 #endregion
354
355 #region Methods triggered by calls from external instances
356 public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData)
357 {
358 if (this.listeners.ContainsKey(regionHandle))
359 {
360 this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData);
361 return true;
362 }
363 return false;
364 }
365
366 public bool IncomingArrival(ulong regionHandle, LLUUID agentID, LLVector3 position)
367 {
368 if (this.listeners.ContainsKey(regionHandle))
369 {
370 this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position);
371 return true;
372 }
373 return false;
374 }
375 #endregion
376 #endregion
377 }
378}
diff --git a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs
new file mode 100644
index 0000000..f514a29
--- /dev/null
+++ b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs
@@ -0,0 +1,69 @@
1using System;
2using libsecondlife;
3using OpenSim.Framework.Types;
4
5namespace OpenSim.Region.Communications.OGS1
6{
7 public delegate bool InformRegionChild(ulong regionHandle, AgentCircuitData agentData);
8 public delegate bool ExpectArrival(ulong regionHandle, LLUUID agentID, LLVector3 position);
9
10 public sealed class InterRegionSingleton
11 {
12 static readonly InterRegionSingleton instance = new InterRegionSingleton();
13
14 public event InformRegionChild OnChildAgent;
15 public event ExpectArrival OnArrival;
16
17 static InterRegionSingleton()
18 {
19 }
20
21 InterRegionSingleton()
22 {
23 }
24
25 public static InterRegionSingleton Instance
26 {
27 get
28 {
29 return instance;
30 }
31 }
32
33 public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData)
34 {
35 if (OnChildAgent != null)
36 {
37 return OnChildAgent(regionHandle, agentData);
38 }
39 return false;
40 }
41
42 public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position)
43 {
44 if (OnArrival != null)
45 {
46 return OnArrival(regionHandle, agentID, position);
47 }
48 return false;
49 }
50 }
51
52 public class OGS1InterRegionRemoting : MarshalByRefObject
53 {
54
55 public OGS1InterRegionRemoting()
56 {
57 }
58
59 public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData)
60 {
61 return InterRegionSingleton.Instance.InformRegionOfChildAgent(regionHandle, agentData);
62 }
63
64 public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position)
65 {
66 return InterRegionSingleton.Instance.ExpectAvatarCrossing(regionHandle, agentID, position);
67 }
68 }
69}
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
new file mode 100644
index 0000000..2bbaf9d
--- /dev/null
+++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
@@ -0,0 +1,105 @@
1using System;
2using System.Collections;
3using libsecondlife;
4using Nwc.XmlRpc;
5using OpenSim.Framework.Communications;
6using OpenSim.Framework.Data;
7
8namespace OpenSim.Region.Communications.OGS1
9{
10 public class OGS1UserServices :IUserServices
11 {
12 CommunicationsOGS1 m_parent;
13 public OGS1UserServices(CommunicationsOGS1 parent)
14 {
15 m_parent = parent;
16 }
17
18 public UserProfileData ConvertXMLRPCDataToUserProfile(Hashtable data)
19 {
20 if (data.Contains("error_type"))
21 {
22 Console.WriteLine("Error sent by user server when trying to get user profile: (" + data["error_type"] + "): " + data["error_desc"]);
23 return null;
24 }
25
26 UserProfileData userData = new UserProfileData();
27 userData.username = (string)data["firstname"];
28 userData.surname = (string)data["lastname"];
29 userData.UUID = new LLUUID((string)data["uuid"]);
30 userData.userInventoryURI = (string)data["server_inventory"];
31 userData.userAssetURI = (string)data["server_asset"];
32 userData.profileFirstText = (string)data["profile_firstlife_about"];
33 userData.profileFirstImage = new LLUUID((string)data["profile_firstlife_image"]);
34 userData.profileCanDoMask = Convert.ToUInt32((string)data["profile_can_do"]);
35 userData.profileWantDoMask = Convert.ToUInt32(data["profile_want_do"]);
36 userData.profileImage = new LLUUID((string)data["profile_image"]);
37 userData.lastLogin = Convert.ToInt32((string)data["profile_lastlogin"]);
38 userData.homeRegion = Convert.ToUInt64((string)data["home_region"]);
39 userData.homeLocation = new LLVector3((float)Convert.ToDecimal((string)data["home_coordinates_x"]), (float)Convert.ToDecimal((string)data["home_coordinates_y"]), (float)Convert.ToDecimal((string)data["home_coordinates_z"]));
40 userData.homeLookAt = new LLVector3((float)Convert.ToDecimal((string)data["home_look_x"]), (float)Convert.ToDecimal((string)data["home_look_y"]), (float)Convert.ToDecimal((string)data["home_look_z"]));
41
42 return userData;
43 }
44 public UserProfileData GetUserProfile(string firstName, string lastName)
45 {
46 return GetUserProfile(firstName + " " + lastName);
47 }
48 public UserProfileData GetUserProfile(string name)
49 {
50 //try
51 //{
52 Hashtable param = new Hashtable();
53 param["avatar_name"] = name;
54 IList parameters = new ArrayList();
55 parameters.Add(param);
56 XmlRpcRequest req = new XmlRpcRequest("get_user_by_name", parameters);
57 XmlRpcResponse resp = req.Send(m_parent.ServersInfo.UserURL, 3000);
58 Hashtable respData = (Hashtable)resp.Value;
59
60 return ConvertXMLRPCDataToUserProfile(respData);
61 //}
62 //catch (Exception e)
63 //{
64 // Console.WriteLine("Error when trying to fetch profile data by name from remote user server: " + e.Message);
65 //}
66 //return null;
67 }
68 public UserProfileData GetUserProfile(LLUUID avatarID)
69 {
70 try
71 {
72
73 Hashtable param = new Hashtable();
74 param["avatar_uuid"] = avatarID.ToString();
75 IList parameters = new ArrayList();
76 parameters.Add(param);
77 XmlRpcRequest req = new XmlRpcRequest("get_user_by_uuid", parameters);
78 XmlRpcResponse resp = req.Send(m_parent.ServersInfo.UserURL, 3000);
79 Hashtable respData = (Hashtable)resp.Value;
80
81 return ConvertXMLRPCDataToUserProfile(respData);
82 }
83 catch (Exception e)
84 {
85 Console.WriteLine("Error when trying to fetch profile data by uuid from remote user server: " + e.Message);
86 }
87 return null;
88 }
89
90 public UserProfileData SetupMasterUser(string firstName, string lastName)
91 {
92 return SetupMasterUser(firstName, lastName, "");
93 }
94
95 public UserProfileData SetupMasterUser(string firstName, string lastName, string password)
96 {
97 UserProfileData profile = GetUserProfile(firstName, lastName);
98 if (profile == null)
99 {
100 Console.WriteLine("Unknown Master User. Grid Mode: No clue what I should do. Probably would choose the grid owner UUID when that is implemented");
101 }
102 return null;
103 }
104 }
105}
diff --git a/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..41f811a
--- /dev/null
+++ b/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
1using System.Reflection;
2using System.Runtime.InteropServices;
3// General Information about an assembly is controlled through the following
4// set of attributes. Change these attribute values to modify the information
5// associated with an assembly.
6[assembly: AssemblyTitle("OpenGrid.Framework.Communications.OGS1")]
7[assembly: AssemblyDescription("")]
8[assembly: AssemblyConfiguration("")]
9[assembly: AssemblyCompany("")]
10[assembly: AssemblyProduct("OpenGrid.Framework.Communications.OGS1")]
11[assembly: AssemblyCopyright("Copyright © 2007")]
12[assembly: AssemblyTrademark("")]
13[assembly: AssemblyCulture("")]
14
15// Setting ComVisible to false makes the types in this assembly not visible
16// to COM components. If you need to access a type in this assembly from
17// COM, set the ComVisible attribute to true on that type.
18[assembly: ComVisible(false)]
19
20// The following GUID is for the ID of the typelib if this project is exposed to COM
21[assembly: Guid("a8b2b39b-c83b-41e2-b0b5-7ccfc1fddae7")]
22
23// Version information for an assembly consists of the following four values:
24//
25// Major Version
26// Minor Version
27// Build Number
28// Revision
29//
30// You can specify all the values or you can default the Revision and Build Numbers
31// by using the '*' as shown below:
32[assembly: AssemblyVersion("1.0.0.0")]
33[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Environment/EstateManager.cs b/OpenSim/Region/Environment/EstateManager.cs
new file mode 100644
index 0000000..b5a74ad
--- /dev/null
+++ b/OpenSim/Region/Environment/EstateManager.cs
@@ -0,0 +1,300 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using libsecondlife;
32using libsecondlife.Packets;
33using OpenSim.Framework.Console;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36using OpenSim.Region.Environment.Scenes;
37using Avatar = OpenSim.Region.Environment.Scenes.ScenePresence;
38
39
40namespace OpenSim.Region.Environment
41{
42
43 /// <summary>
44 /// Processes requests regarding estates. Refer to EstateSettings.cs in OpenSim.Framework. Types for all of the core settings
45 /// </summary>
46 public class EstateManager
47 {
48 private Scene m_world;
49 private RegionInfo m_regInfo;
50
51 public EstateManager(Scene world,RegionInfo reginfo)
52 {
53 m_world = world; //Estate settings found at world.m_regInfo.estateSettings
54 m_regInfo = reginfo;
55 }
56
57 private bool convertParamStringToBool(byte[] field)
58 {
59 string s = Helpers.FieldToUTF8String(field);
60 if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
61 {
62 return true;
63 }
64 return false;
65 }
66
67 public void handleEstateOwnerMessage(EstateOwnerMessagePacket packet, IClientAPI remote_client)
68 {
69 if (remote_client.AgentId == m_regInfo.MasterAvatarAssignedUUID)
70 {
71 switch (Helpers.FieldToUTF8String(packet.MethodData.Method))
72 {
73 case "getinfo":
74 Console.WriteLine("GETINFO Requested");
75 this.sendRegionInfoPacketToAll();
76
77 break;
78 case "setregioninfo":
79 if (packet.ParamList.Length != 9)
80 {
81 MainLog.Instance.Error("EstateOwnerMessage: SetRegionInfo method has a ParamList of invalid length");
82 }
83 else
84 {
85 m_regInfo.estateSettings.regionFlags = Simulator.RegionFlags.None;
86
87 if (convertParamStringToBool(packet.ParamList[0].Parameter))
88 {
89 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.BlockTerraform;
90 }
91
92 if (convertParamStringToBool(packet.ParamList[1].Parameter))
93 {
94 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.NoFly;
95 }
96
97 if (convertParamStringToBool(packet.ParamList[2].Parameter))
98 {
99 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.AllowDamage;
100 }
101
102 if (convertParamStringToBool(packet.ParamList[3].Parameter) == false)
103 {
104 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.BlockLandResell;
105 }
106
107
108 int tempMaxAgents = Convert.ToInt16(Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[4].Parameter)));
109 m_regInfo.estateSettings.maxAgents = (byte)tempMaxAgents;
110
111 float tempObjectBonusFactor = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter));
112 m_regInfo.estateSettings.objectBonusFactor = tempObjectBonusFactor;
113
114 int tempMatureLevel = Convert.ToInt16(Helpers.FieldToUTF8String(packet.ParamList[6].Parameter));
115 m_regInfo.estateSettings.simAccess = (Simulator.SimAccess)tempMatureLevel;
116
117
118 if (convertParamStringToBool(packet.ParamList[7].Parameter))
119 {
120 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.RestrictPushObject;
121 }
122
123 if (convertParamStringToBool(packet.ParamList[8].Parameter))
124 {
125 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.AllowParcelChanges;
126 }
127
128 sendRegionInfoPacketToAll();
129
130 }
131 break;
132 case "texturebase":
133 foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
134 {
135 string s = Helpers.FieldToUTF8String(block.Parameter);
136 string[] splitField = s.Split(' ');
137 if (splitField.Length == 2)
138 {
139 LLUUID tempUUID = new LLUUID(splitField[1]);
140 switch (Convert.ToInt16(splitField[0]))
141 {
142 case 0:
143 m_regInfo.estateSettings.terrainBase0 = tempUUID;
144 break;
145 case 1:
146 m_regInfo.estateSettings.terrainBase1 = tempUUID;
147 break;
148 case 2:
149 m_regInfo.estateSettings.terrainBase2 = tempUUID;
150 break;
151 case 3:
152 m_regInfo.estateSettings.terrainBase3 = tempUUID;
153 break;
154 }
155 }
156 }
157 break;
158 case "texturedetail":
159 foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
160 {
161
162 string s = Helpers.FieldToUTF8String(block.Parameter);
163 string[] splitField = s.Split(' ');
164 if (splitField.Length == 2)
165 {
166 LLUUID tempUUID = new LLUUID(splitField[1]);
167 switch (Convert.ToInt16(splitField[0]))
168 {
169 case 0:
170 m_regInfo.estateSettings.terrainDetail0 = tempUUID;
171 break;
172 case 1:
173 m_regInfo.estateSettings.terrainDetail1 = tempUUID;
174 break;
175 case 2:
176 m_regInfo.estateSettings.terrainDetail2 = tempUUID;
177 break;
178 case 3:
179 m_regInfo.estateSettings.terrainDetail3 = tempUUID;
180 break;
181 }
182 }
183 }
184 break;
185 case "textureheights":
186 foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
187 {
188
189 string s = Helpers.FieldToUTF8String(block.Parameter);
190 string[] splitField = s.Split(' ');
191 if (splitField.Length == 3)
192 {
193
194 float tempHeightLow = (float)Convert.ToDecimal(splitField[1]);
195 float tempHeightHigh = (float)Convert.ToDecimal(splitField[2]);
196
197 switch (Convert.ToInt16(splitField[0]))
198 {
199 case 0:
200 m_regInfo.estateSettings.terrainStartHeight0 = tempHeightLow;
201 m_regInfo.estateSettings.terrainHeightRange0 = tempHeightHigh;
202 break;
203 case 1:
204 m_regInfo.estateSettings.terrainStartHeight1 = tempHeightLow;
205 m_regInfo.estateSettings.terrainHeightRange1 = tempHeightHigh;
206 break;
207 case 2:
208 m_regInfo.estateSettings.terrainStartHeight2 = tempHeightLow;
209 m_regInfo.estateSettings.terrainHeightRange2 = tempHeightHigh;
210 break;
211 case 3:
212 m_regInfo.estateSettings.terrainStartHeight3 = tempHeightLow;
213 m_regInfo.estateSettings.terrainHeightRange3 = tempHeightHigh;
214 break;
215 }
216 }
217 }
218 break;
219 case "texturecommit":
220 sendRegionHandshakeToAll();
221 break;
222 case "setregionterrain":
223 if (packet.ParamList.Length != 9)
224 {
225 MainLog.Instance.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
226 }
227 else
228 {
229 m_regInfo.estateSettings.waterHeight = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[0].Parameter));
230 m_regInfo.estateSettings.terrainRaiseLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[1].Parameter));
231 m_regInfo.estateSettings.terrainLowerLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[2].Parameter));
232 m_regInfo.estateSettings.useFixedSun = this.convertParamStringToBool(packet.ParamList[4].Parameter);
233 m_regInfo.estateSettings.sunHour = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter));
234
235 sendRegionInfoPacketToAll();
236 }
237 break;
238 default:
239 MainLog.Instance.Error("EstateOwnerMessage: Unknown method requested\n" + packet.ToString());
240 break;
241 }
242 }
243 }
244
245 public void sendRegionInfoPacketToAll()
246 {
247 List<Avatar> avatars = m_world.RequestAvatarList();
248
249 for (int i = 0; i < avatars.Count; i++)
250 {
251 this.sendRegionInfoPacket(avatars[i].ControllingClient);
252 }
253 }
254
255 public void sendRegionHandshakeToAll()
256 {
257 List<Avatar> avatars = m_world.RequestAvatarList();
258
259 for (int i = 0; i < avatars.Count; i++)
260 {
261 this.sendRegionHandshake(avatars[i].ControllingClient);
262 }
263 }
264
265 public void sendRegionInfoPacket(IClientAPI remote_client)
266 {
267 Encoding _enc = Encoding.ASCII;
268
269 AgentCircuitData circuitData = remote_client.RequestClientInfo();
270
271 RegionInfoPacket regionInfoPacket = new RegionInfoPacket();
272 regionInfoPacket.AgentData.AgentID = circuitData.AgentID;
273 regionInfoPacket.AgentData.SessionID = circuitData.SessionID;
274 regionInfoPacket.RegionInfo.BillableFactor = m_regInfo.estateSettings.billableFactor;
275 regionInfoPacket.RegionInfo.EstateID = m_regInfo.estateSettings.estateID;
276 regionInfoPacket.RegionInfo.MaxAgents = m_regInfo.estateSettings.maxAgents;
277 regionInfoPacket.RegionInfo.ObjectBonusFactor = m_regInfo.estateSettings.objectBonusFactor;
278 regionInfoPacket.RegionInfo.ParentEstateID = m_regInfo.estateSettings.parentEstateID;
279 regionInfoPacket.RegionInfo.PricePerMeter = m_regInfo.estateSettings.pricePerMeter;
280 regionInfoPacket.RegionInfo.RedirectGridX = m_regInfo.estateSettings.redirectGridX;
281 regionInfoPacket.RegionInfo.RedirectGridY = m_regInfo.estateSettings.redirectGridY;
282 regionInfoPacket.RegionInfo.RegionFlags = (uint)m_regInfo.estateSettings.regionFlags;
283 regionInfoPacket.RegionInfo.SimAccess = (byte)m_regInfo.estateSettings.simAccess;
284 regionInfoPacket.RegionInfo.SimName = _enc.GetBytes( m_regInfo.RegionName);
285 regionInfoPacket.RegionInfo.SunHour = m_regInfo.estateSettings.sunHour;
286 regionInfoPacket.RegionInfo.TerrainLowerLimit = m_regInfo.estateSettings.terrainLowerLimit;
287 regionInfoPacket.RegionInfo.TerrainRaiseLimit = m_regInfo.estateSettings.terrainRaiseLimit;
288 regionInfoPacket.RegionInfo.UseEstateSun = !m_regInfo.estateSettings.useFixedSun;
289 regionInfoPacket.RegionInfo.WaterHeight = m_regInfo.estateSettings.waterHeight;
290
291 remote_client.OutPacket(regionInfoPacket);
292 }
293
294 public void sendRegionHandshake(IClientAPI remoteClient)
295 {
296 remoteClient.SendRegionHandshake(m_regInfo);
297 }
298
299 }
300}
diff --git a/OpenSim/Region/Environment/ParcelManager.cs b/OpenSim/Region/Environment/ParcelManager.cs
new file mode 100644
index 0000000..2059b3f
--- /dev/null
+++ b/OpenSim/Region/Environment/ParcelManager.cs
@@ -0,0 +1,891 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using libsecondlife;
31using libsecondlife.Packets;
32using OpenSim.Framework.Interfaces;
33using OpenSim.Framework.Types;
34using OpenSim.Region.Environment.Scenes;
35using Avatar = OpenSim.Region.Environment.Scenes.ScenePresence;
36
37namespace OpenSim.Region.Environment
38{
39
40
41 #region ParcelManager Class
42 /// <summary>
43 /// Handles Parcel objects and operations requiring information from other Parcel objects (divide, join, etc)
44 /// </summary>
45 public class ParcelManager : ILocalStorageParcelReceiver
46 {
47
48 #region Constants
49 //Parcel types set with flags in ParcelOverlay.
50 //Only one of these can be used.
51 public const byte PARCEL_TYPE_PUBLIC = (byte)0; //Equals 00000000
52 public const byte PARCEL_TYPE_OWNED_BY_OTHER = (byte)1; //Equals 00000001
53 public const byte PARCEL_TYPE_OWNED_BY_GROUP = (byte)2; //Equals 00000010
54 public const byte PARCEL_TYPE_OWNED_BY_REQUESTER = (byte)3; //Equals 00000011
55 public const byte PARCEL_TYPE_IS_FOR_SALE = (byte)4; //Equals 00000100
56 public const byte PARCEL_TYPE_IS_BEING_AUCTIONED = (byte)5; //Equals 00000101
57
58
59 //Flags that when set, a border on the given side will be placed
60 //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)
61 //This took forever to figure out -- jeesh. /blame LL for even having to send these
62 public const byte PARCEL_FLAG_PROPERTY_BORDER_WEST = (byte)64; //Equals 01000000
63 public const byte PARCEL_FLAG_PROPERTY_BORDER_SOUTH = (byte)128; //Equals 10000000
64
65 //RequestResults (I think these are right, they seem to work):
66 public const int PARCEL_RESULT_ONE_PARCEL = 0; // The request they made contained only one parcel
67 public const int PARCEL_RESULT_MULTIPLE_PARCELS = 1; // The request they made contained more than one parcel
68
69 //These are other constants. Yay!
70 public const int START_PARCEL_LOCAL_ID = 1;
71 #endregion
72
73 #region Member Variables
74 public Dictionary<int, Parcel> parcelList = new Dictionary<int, Parcel>();
75 private int lastParcelLocalID = START_PARCEL_LOCAL_ID - 1;
76 private int[,] parcelIDList = new int[64, 64];
77
78 private Scene m_world;
79 private RegionInfo m_regInfo;
80
81 #endregion
82
83 #region Constructors
84 public ParcelManager(Scene world, RegionInfo reginfo)
85 {
86
87 m_world = world;
88 m_regInfo = reginfo;
89 parcelIDList.Initialize();
90
91 }
92 #endregion
93
94 #region Member Functions
95
96 #region Parcel From Storage Functions
97 public void ParcelFromStorage(ParcelData data)
98 {
99 Parcel new_parcel = new Parcel(data.ownerID, data.isGroupOwned, m_world);
100 new_parcel.parcelData = data.Copy();
101 new_parcel.setParcelBitmapFromByteArray();
102 addParcel(new_parcel);
103
104 }
105
106 public void NoParcelDataFromStorage()
107 {
108 resetSimParcels();
109 }
110 #endregion
111
112 #region Parcel Add/Remove/Get/Create
113 /// <summary>
114 /// Creates a basic Parcel object without an owner (a zeroed key)
115 /// </summary>
116 /// <returns></returns>
117 public Parcel createBaseParcel()
118 {
119 return new Parcel(new LLUUID(), false, m_world);
120 }
121
122 /// <summary>
123 /// Adds a parcel to the stored list and adds them to the parcelIDList to what they own
124 /// </summary>
125 /// <param name="new_parcel">The parcel being added</param>
126 public void addParcel(Parcel new_parcel)
127 {
128 lastParcelLocalID++;
129 new_parcel.parcelData.localID = lastParcelLocalID;
130 parcelList.Add(lastParcelLocalID, new_parcel.Copy());
131
132
133 bool[,] parcelBitmap = new_parcel.getParcelBitmap();
134 int x, y;
135 for (x = 0; x < 64; x++)
136 {
137 for (y = 0; y < 64; y++)
138 {
139 if (parcelBitmap[x, y])
140 {
141 parcelIDList[x, y] = lastParcelLocalID;
142 }
143 }
144 }
145 parcelList[lastParcelLocalID].forceUpdateParcelInfo();
146
147
148 }
149 /// <summary>
150 /// Removes a parcel from the list. Will not remove if local_id is still owning an area in parcelIDList
151 /// </summary>
152 /// <param name="local_id">Parcel.localID of the parcel to remove.</param>
153 public void removeParcel(int local_id)
154 {
155 int x, y;
156 for (x = 0; x < 64; x++)
157 {
158 for (y = 0; y < 64; y++)
159 {
160 if (parcelIDList[x, y] == local_id)
161 {
162 throw new Exception("Could not remove parcel. Still being used at " + x + ", " + y);
163 }
164 }
165 }
166 m_world.localStorage.RemoveParcel(parcelList[local_id].parcelData);
167 parcelList.Remove(local_id);
168 }
169
170 private void performFinalParcelJoin(Parcel master, Parcel slave)
171 {
172 int x, y;
173 bool[,] parcelBitmapSlave = slave.getParcelBitmap();
174 for (x = 0; x < 64; x++)
175 {
176 for (y = 0; y < 64; y++)
177 {
178 if (parcelBitmapSlave[x, y])
179 {
180 parcelIDList[x, y] = master.parcelData.localID;
181 }
182 }
183 }
184 removeParcel(slave.parcelData.localID);
185 }
186 /// <summary>
187 /// Get the parcel at the specified point
188 /// </summary>
189 /// <param name="x">Value between 0 - 256 on the x axis of the point</param>
190 /// <param name="y">Value between 0 - 256 on the y axis of the point</param>
191 /// <returns>Parcel at the point supplied</returns>
192 public Parcel getParcel(int x, int y)
193 {
194 if (x > 256 || y > 256 || x < 0 || y < 0)
195 {
196 throw new Exception("Error: Parcel not found at point " + x + ", " + y);
197 }
198 else
199 {
200 return parcelList[parcelIDList[x / 4, y / 4]];
201 }
202
203 }
204 #endregion
205
206 #region Parcel Modification
207 /// <summary>
208 /// Subdivides a parcel
209 /// </summary>
210 /// <param name="start_x">West Point</param>
211 /// <param name="start_y">South Point</param>
212 /// <param name="end_x">East Point</param>
213 /// <param name="end_y">North Point</param>
214 /// <param name="attempting_user_id">LLUUID of user who is trying to subdivide</param>
215 /// <returns>Returns true if successful</returns>
216 private bool subdivide(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id)
217 {
218 //First, lets loop through the points and make sure they are all in the same parcel
219 //Get the parcel at start
220 Parcel startParcel = getParcel(start_x, start_y);
221 if (startParcel == null) return false; //No such parcel at the beginning
222
223 //Loop through the points
224 try
225 {
226 int totalX = end_x - start_x;
227 int totalY = end_y - start_y;
228 int x, y;
229 for (y = 0; y < totalY; y++)
230 {
231 for (x = 0; x < totalX; x++)
232 {
233 Parcel tempParcel = getParcel(start_x + x, start_y + y);
234 if (tempParcel == null) return false; //No such parcel at that point
235 if (tempParcel != startParcel) return false; //Subdividing over 2 parcels; no-no
236 }
237 }
238 }
239 catch (Exception)
240 {
241 return false; //Exception. For now, lets skip subdivision
242 }
243
244 //If we are still here, then they are subdividing within one parcel
245 //Check owner
246 if (startParcel.parcelData.ownerID != attempting_user_id)
247 {
248 return false; //They cant do this!
249 }
250
251 //Lets create a new parcel with bitmap activated at that point (keeping the old parcels info)
252 Parcel newParcel = startParcel.Copy();
253 newParcel.parcelData.parcelName = "Subdivision of " + newParcel.parcelData.parcelName;
254 newParcel.parcelData.globalID = LLUUID.Random();
255
256 newParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(start_x, start_y, end_x, end_y));
257
258 //Now, lets set the subdivision area of the original to false
259 int startParcelIndex = startParcel.parcelData.localID;
260 parcelList[startParcelIndex].setParcelBitmap(Parcel.modifyParcelBitmapSquare(startParcel.getParcelBitmap(), start_x, start_y, end_x, end_y, false));
261 parcelList[startParcelIndex].forceUpdateParcelInfo();
262
263
264 //Now add the new parcel
265 addParcel(newParcel);
266
267
268
269
270
271 return true;
272 }
273 /// <summary>
274 /// Join 2 parcels together
275 /// </summary>
276 /// <param name="start_x">x value in first parcel</param>
277 /// <param name="start_y">y value in first parcel</param>
278 /// <param name="end_x">x value in second parcel</param>
279 /// <param name="end_y">y value in second parcel</param>
280 /// <param name="attempting_user_id">LLUUID of the avatar trying to join the parcels</param>
281 /// <returns>Returns true if successful</returns>
282 private bool join(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id)
283 {
284 end_x -= 4;
285 end_y -= 4;
286
287 //NOTE: The following only connects the parcels in each corner and not all the parcels that are within the selection box!
288 //This should be fixed later -- somewhat "incomplete code" --Ming
289 Parcel startParcel, endParcel;
290
291 try
292 {
293 startParcel = getParcel(start_x, start_y);
294 endParcel = getParcel(end_x, end_y);
295 }
296 catch (Exception)
297 {
298 return false; //Error occured when trying to get the start and end parcels
299 }
300 if (startParcel == endParcel)
301 {
302 return false; //Subdivision of the same parcel is not allowed
303 }
304
305 //Check the parcel owners:
306 if (startParcel.parcelData.ownerID != endParcel.parcelData.ownerID)
307 {
308 return false;
309 }
310 if (startParcel.parcelData.ownerID != attempting_user_id)
311 {
312 //TODO: Group editing stuff. Avatar owner support for now
313 return false;
314 }
315
316 //Same owners! Lets join them
317 //Merge them to startParcel
318 parcelList[startParcel.parcelData.localID].setParcelBitmap(Parcel.mergeParcelBitmaps(startParcel.getParcelBitmap(), endParcel.getParcelBitmap()));
319 performFinalParcelJoin(startParcel, endParcel);
320
321 return true;
322
323
324
325 }
326 #endregion
327
328 #region Parcel Updating
329 /// <summary>
330 /// Where we send the ParcelOverlay packet to the client
331 /// </summary>
332 /// <param name="remote_client">The object representing the client</param>
333 public void sendParcelOverlay(IClientAPI remote_client)
334 {
335 const int PARCEL_BLOCKS_PER_PACKET = 1024;
336 int x, y = 0;
337 byte[] byteArray = new byte[PARCEL_BLOCKS_PER_PACKET];
338 int byteArrayCount = 0;
339 int sequenceID = 0;
340 ParcelOverlayPacket packet;
341
342 for (y = 0; y < 64; y++)
343 {
344 for (x = 0; x < 64; x++)
345 {
346 byte tempByte = (byte)0; //This represents the byte for the current 4x4
347 Parcel currentParcelBlock = getParcel(x * 4, y * 4);
348
349 if (currentParcelBlock.parcelData.ownerID == remote_client.AgentId)
350 {
351 //Owner Flag
352 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_REQUESTER);
353 }
354 else if (currentParcelBlock.parcelData.salePrice > 0 && (currentParcelBlock.parcelData.authBuyerID == LLUUID.Zero || currentParcelBlock.parcelData.authBuyerID == remote_client.AgentId))
355 {
356 //Sale Flag
357 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_IS_FOR_SALE);
358 }
359 else if (currentParcelBlock.parcelData.ownerID == LLUUID.Zero)
360 {
361 //Public Flag
362 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_PUBLIC);
363 }
364 else
365 {
366 //Other Flag
367 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_OTHER);
368 }
369
370
371 //Now for border control
372 if (x == 0)
373 {
374 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST);
375 }
376 else if (getParcel((x - 1) * 4, y * 4) != currentParcelBlock)
377 {
378 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST);
379 }
380
381 if (y == 0)
382 {
383 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH);
384 }
385 else if (getParcel(x * 4, (y - 1) * 4) != currentParcelBlock)
386 {
387 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH);
388 }
389
390 byteArray[byteArrayCount] = tempByte;
391 byteArrayCount++;
392 if (byteArrayCount >= PARCEL_BLOCKS_PER_PACKET)
393 {
394 byteArrayCount = 0;
395 packet = new ParcelOverlayPacket();
396 packet.ParcelData.Data = byteArray;
397 packet.ParcelData.SequenceID = sequenceID;
398 remote_client.OutPacket((Packet)packet);
399 sequenceID++;
400 byteArray = new byte[PARCEL_BLOCKS_PER_PACKET];
401 }
402 }
403 }
404
405 packet = new ParcelOverlayPacket();
406 packet.ParcelData.Data = byteArray;
407 packet.ParcelData.SequenceID = sequenceID; //Eh?
408 remote_client.OutPacket((Packet)packet);
409 }
410
411 public void handleParcelPropertiesRequest(int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client)
412 {
413 //Get the parcels within the bounds
414 List<Parcel> temp = new List<Parcel>();
415 int x, y, i;
416 int inc_x = end_x - start_x;
417 int inc_y = end_y - start_y;
418 for (x = 0; x < inc_x; x++)
419 {
420 for (y = 0; y < inc_y; y++)
421 {
422 Parcel currentParcel = getParcel(start_x + x, start_y + y);
423 if (!temp.Contains(currentParcel))
424 {
425 currentParcel.forceUpdateParcelInfo();
426 temp.Add(currentParcel);
427 }
428 }
429 }
430
431 int requestResult = PARCEL_RESULT_ONE_PARCEL;
432 if (temp.Count > 1)
433 {
434 requestResult = PARCEL_RESULT_MULTIPLE_PARCELS;
435 }
436
437 for (i = 0; i < temp.Count; i++)
438 {
439 temp[i].sendParcelProperties(sequence_id, snap_selection, requestResult, remote_client);
440 }
441
442
443 sendParcelOverlay(remote_client);
444 }
445
446 public void handleParcelPropertiesUpdateRequest(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client)
447 {
448 if (parcelList.ContainsKey(packet.ParcelData.LocalID))
449 {
450 parcelList[packet.ParcelData.LocalID].updateParcelProperties(packet, remote_client);
451 }
452 }
453 public void handleParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client)
454 {
455 subdivide(west, south, east, north, remote_client.AgentId);
456 }
457 public void handleParcelJoinRequest(int west, int south, int east, int north, IClientAPI remote_client)
458 {
459 join(west, south, east, north, remote_client.AgentId);
460
461 }
462 #endregion
463
464 /// <summary>
465 /// Resets the sim to the default parcel (full sim parcel owned by the default user)
466 /// </summary>
467 public void resetSimParcels()
468 {
469 //Remove all the parcels in the sim and add a blank, full sim parcel set to public
470 parcelList.Clear();
471 lastParcelLocalID = START_PARCEL_LOCAL_ID - 1;
472 parcelIDList.Initialize();
473
474 Parcel fullSimParcel = new Parcel(LLUUID.Zero, false, m_world);
475
476 fullSimParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(0, 0, 256, 256));
477 fullSimParcel.parcelData.parcelName = "Your Sim Parcel";
478 fullSimParcel.parcelData.parcelDesc = "";
479
480 fullSimParcel.parcelData.ownerID = m_regInfo.MasterAvatarAssignedUUID;
481 fullSimParcel.parcelData.salePrice = 1;
482 fullSimParcel.parcelData.parcelFlags = libsecondlife.Parcel.ParcelFlags.ForSale;
483 fullSimParcel.parcelData.parcelStatus = libsecondlife.Parcel.ParcelStatus.Leased;
484
485 addParcel(fullSimParcel);
486
487 }
488 #endregion
489 }
490 #endregion
491
492
493 #region Parcel Class
494 /// <summary>
495 /// Keeps track of a specific parcel's information
496 /// </summary>
497 public class Parcel
498 {
499 #region Member Variables
500 public ParcelData parcelData = new ParcelData();
501 public Scene m_world;
502
503 private bool[,] parcelBitmap = new bool[64, 64];
504
505 #endregion
506
507
508 #region Constructors
509 public Parcel(LLUUID owner_id, bool is_group_owned, Scene world)
510 {
511 m_world = world;
512 parcelData.ownerID = owner_id;
513 parcelData.isGroupOwned = is_group_owned;
514
515 }
516 #endregion
517
518
519 #region Member Functions
520
521 #region General Functions
522 /// <summary>
523 /// Checks to see if this parcel contains a point
524 /// </summary>
525 /// <param name="x"></param>
526 /// <param name="y"></param>
527 /// <returns>Returns true if the parcel contains the specified point</returns>
528 public bool containsPoint(int x, int y)
529 {
530 if (x >= 0 && y >= 0 && x <= 256 && x <= 256)
531 {
532 return (parcelBitmap[x / 4, y / 4] == true);
533 }
534 else
535 {
536 return false;
537 }
538 }
539
540 public Parcel Copy()
541 {
542 Parcel newParcel = new Parcel(this.parcelData.ownerID, this.parcelData.isGroupOwned, m_world);
543
544 //Place all new variables here!
545 newParcel.parcelBitmap = (bool[,])(this.parcelBitmap.Clone());
546 newParcel.parcelData = parcelData.Copy();
547
548 return newParcel;
549 }
550
551 #endregion
552
553
554 #region Packet Request Handling
555 /// <summary>
556 /// Sends parcel properties as requested
557 /// </summary>
558 /// <param name="sequence_id">ID sent by client for them to keep track of</param>
559 /// <param name="snap_selection">Bool sent by client for them to use</param>
560 /// <param name="remote_client">Object representing the client</param>
561 public void sendParcelProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client)
562 {
563
564 ParcelPropertiesPacket updatePacket = new ParcelPropertiesPacket();
565 updatePacket.ParcelData.AABBMax = parcelData.AABBMax;
566 updatePacket.ParcelData.AABBMin = parcelData.AABBMin;
567 updatePacket.ParcelData.Area = parcelData.area;
568 updatePacket.ParcelData.AuctionID = parcelData.auctionID;
569 updatePacket.ParcelData.AuthBuyerID = parcelData.authBuyerID; //unemplemented
570
571 updatePacket.ParcelData.Bitmap = parcelData.parcelBitmapByteArray;
572
573 updatePacket.ParcelData.Desc = Helpers.StringToField(parcelData.parcelDesc);
574 updatePacket.ParcelData.Category = (byte)parcelData.category;
575 updatePacket.ParcelData.ClaimDate = parcelData.claimDate;
576 updatePacket.ParcelData.ClaimPrice = parcelData.claimPrice;
577 updatePacket.ParcelData.GroupID = parcelData.groupID;
578 updatePacket.ParcelData.GroupPrims = parcelData.groupPrims;
579 updatePacket.ParcelData.IsGroupOwned = parcelData.isGroupOwned;
580 updatePacket.ParcelData.LandingType = (byte)parcelData.landingType;
581 updatePacket.ParcelData.LocalID = parcelData.localID;
582 updatePacket.ParcelData.MaxPrims = 1000; //unemplemented
583 updatePacket.ParcelData.MediaAutoScale = parcelData.mediaAutoScale;
584 updatePacket.ParcelData.MediaID = parcelData.mediaID;
585 updatePacket.ParcelData.MediaURL = Helpers.StringToField(parcelData.mediaURL);
586 updatePacket.ParcelData.MusicURL = Helpers.StringToField(parcelData.musicURL);
587 updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName);
588 updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented
589 updatePacket.ParcelData.OtherCount = 0; //unemplemented
590 updatePacket.ParcelData.OtherPrims = 0; //unemplented
591 updatePacket.ParcelData.OwnerID = parcelData.ownerID;
592 updatePacket.ParcelData.OwnerPrims = 0; //unemplemented
593 updatePacket.ParcelData.ParcelFlags = (uint)parcelData.parcelFlags; //unemplemented
594 updatePacket.ParcelData.ParcelPrimBonus = (float)1.0; //unemplemented
595 updatePacket.ParcelData.PassHours = parcelData.passHours;
596 updatePacket.ParcelData.PassPrice = parcelData.passPrice;
597 updatePacket.ParcelData.PublicCount = 0; //unemplemented
598 updatePacket.ParcelData.RegionDenyAnonymous = false; //unemplemented
599 updatePacket.ParcelData.RegionDenyIdentified = false; //unemplemented
600 updatePacket.ParcelData.RegionDenyTransacted = false; //unemplemented
601 updatePacket.ParcelData.RegionPushOverride = true; //unemplemented
602 updatePacket.ParcelData.RentPrice = 0; //??
603 updatePacket.ParcelData.RequestResult = request_result;
604 updatePacket.ParcelData.SalePrice = parcelData.salePrice; //unemplemented
605 updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented
606 updatePacket.ParcelData.SelfCount = 0;//unemplemented
607 updatePacket.ParcelData.SequenceID = sequence_id;
608 updatePacket.ParcelData.SimWideMaxPrims = 15000; //unemplemented
609 updatePacket.ParcelData.SimWideTotalPrims = 0; //unemplemented
610 updatePacket.ParcelData.SnapSelection = snap_selection;
611 updatePacket.ParcelData.SnapshotID = parcelData.snapshotID;
612 updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus;
613 updatePacket.ParcelData.TotalPrims = 0; //unemplemented
614 updatePacket.ParcelData.UserLocation = parcelData.userLocation;
615 updatePacket.ParcelData.UserLookAt = parcelData.userLookAt;
616 remote_client.OutPacket((Packet)updatePacket);
617 }
618
619 public void updateParcelProperties(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client)
620 {
621 if (remote_client.AgentId == parcelData.ownerID)
622 {
623 //Needs later group support
624 parcelData.authBuyerID = packet.ParcelData.AuthBuyerID;
625 parcelData.category = (libsecondlife.Parcel.ParcelCategory)packet.ParcelData.Category;
626 parcelData.parcelDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc);
627 parcelData.groupID = packet.ParcelData.GroupID;
628 parcelData.landingType = packet.ParcelData.LandingType;
629 parcelData.mediaAutoScale = packet.ParcelData.MediaAutoScale;
630 parcelData.mediaID = packet.ParcelData.MediaID;
631 parcelData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL);
632 parcelData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL);
633 parcelData.parcelName = Helpers.FieldToUTF8String(packet.ParcelData.Name);
634 parcelData.parcelFlags = (libsecondlife.Parcel.ParcelFlags)packet.ParcelData.ParcelFlags;
635 parcelData.passHours = packet.ParcelData.PassHours;
636 parcelData.passPrice = packet.ParcelData.PassPrice;
637 parcelData.salePrice = packet.ParcelData.SalePrice;
638 parcelData.snapshotID = packet.ParcelData.SnapshotID;
639 parcelData.userLocation = packet.ParcelData.UserLocation;
640 parcelData.userLookAt = packet.ParcelData.UserLookAt;
641
642 List<Avatar> avatars = m_world.RequestAvatarList();
643
644 for (int i = 0; i < avatars.Count; i++)
645 {
646 Parcel over = m_world.parcelManager.getParcel((int)Math.Round(avatars[i].Pos.X), (int)Math.Round(avatars[i].Pos.Y));
647 if (over == this)
648 {
649 sendParcelProperties(0, false, 0, avatars[i].ControllingClient);
650 }
651 }
652
653 }
654 }
655 #endregion
656
657
658 #region Update Functions
659 /// <summary>
660 /// Updates the AABBMin and AABBMax values after area/shape modification of parcel
661 /// </summary>
662 private void updateAABBAndAreaValues()
663 {
664 int min_x = 64;
665 int min_y = 64;
666 int max_x = 0;
667 int max_y = 0;
668 int tempArea = 0;
669 int x, y;
670 for (x = 0; x < 64; x++)
671 {
672 for (y = 0; y < 64; y++)
673 {
674 if (parcelBitmap[x, y] == true)
675 {
676 if (min_x > x) min_x = x;
677 if (min_y > y) min_y = y;
678 if (max_x < x) max_x = x;
679 if (max_y < y) max_y = y;
680 tempArea += 16; //16sqm parcel
681 }
682 }
683 }
684 parcelData.AABBMin = new LLVector3((float)(min_x * 4), (float)(min_y * 4), (float)m_world.Terrain.get((min_x * 4), (min_y * 4)));
685 parcelData.AABBMax = new LLVector3((float)(max_x * 4), (float)(max_y * 4), (float)m_world.Terrain.get((max_x * 4), (max_y * 4)));
686 parcelData.area = tempArea;
687 }
688
689 public void updateParcelBitmapByteArray()
690 {
691 parcelData.parcelBitmapByteArray = convertParcelBitmapToBytes();
692 }
693
694 /// <summary>
695 /// Update all settings in parcel such as area, bitmap byte array, etc
696 /// </summary>
697 public void forceUpdateParcelInfo()
698 {
699 this.updateAABBAndAreaValues();
700 this.updateParcelBitmapByteArray();
701 }
702
703 public void setParcelBitmapFromByteArray()
704 {
705 parcelBitmap = convertBytesToParcelBitmap();
706 }
707 #endregion
708
709
710 #region Parcel Bitmap Functions
711 /// <summary>
712 /// Sets the parcel's bitmap manually
713 /// </summary>
714 /// <param name="bitmap">64x64 block representing where this parcel is on a map</param>
715 public void setParcelBitmap(bool[,] bitmap)
716 {
717 if (bitmap.GetLength(0) != 64 || bitmap.GetLength(1) != 64 || bitmap.Rank != 2)
718 {
719 //Throw an exception - The bitmap is not 64x64
720 throw new Exception("Error: Invalid Parcel Bitmap");
721 }
722 else
723 {
724 //Valid: Lets set it
725 parcelBitmap = bitmap;
726 forceUpdateParcelInfo();
727
728 }
729 }
730 /// <summary>
731 /// Gets the parcels bitmap manually
732 /// </summary>
733 /// <returns></returns>
734 public bool[,] getParcelBitmap()
735 {
736 return parcelBitmap;
737 }
738 /// <summary>
739 /// Converts the parcel bitmap to a packet friendly byte array
740 /// </summary>
741 /// <returns></returns>
742 private byte[] convertParcelBitmapToBytes()
743 {
744 byte[] tempConvertArr = new byte[512];
745 byte tempByte = 0;
746 int x, y, i, byteNum = 0;
747 i = 0;
748 for (y = 0; y < 64; y++)
749 {
750 for (x = 0; x < 64; x++)
751 {
752 tempByte = Convert.ToByte(tempByte | Convert.ToByte(parcelBitmap[x, y]) << (i++ % 8));
753 if (i % 8 == 0)
754 {
755 tempConvertArr[byteNum] = tempByte;
756 tempByte = (byte)0;
757 i = 0;
758 byteNum++;
759 }
760 }
761 }
762 return tempConvertArr;
763 }
764
765 private bool[,] convertBytesToParcelBitmap()
766 {
767 bool[,] tempConvertMap = new bool[64, 64];
768 tempConvertMap.Initialize();
769 byte tempByte = 0;
770 int x = 0, y = 0, i = 0, bitNum = 0;
771 for (i = 0; i < 512; i++)
772 {
773 tempByte = parcelData.parcelBitmapByteArray[i];
774 for (bitNum = 0; bitNum < 8; bitNum++)
775 {
776 bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte)1);
777 tempConvertMap[x, y] = bit;
778 x++;
779 if (x > 63)
780 {
781 x = 0;
782 y++;
783 }
784
785 }
786
787 }
788 return tempConvertMap;
789 }
790 /// <summary>
791 /// Full sim parcel creation
792 /// </summary>
793 /// <returns></returns>
794 public static bool[,] basicFullRegionParcelBitmap()
795 {
796 return getSquareParcelBitmap(0, 0, 256, 256);
797 }
798
799 /// <summary>
800 /// Used to modify the bitmap between the x and y points. Points use 64 scale
801 /// </summary>
802 /// <param name="start_x"></param>
803 /// <param name="start_y"></param>
804 /// <param name="end_x"></param>
805 /// <param name="end_y"></param>
806 /// <returns></returns>
807 public static bool[,] getSquareParcelBitmap(int start_x, int start_y, int end_x, int end_y)
808 {
809
810 bool[,] tempBitmap = new bool[64, 64];
811 tempBitmap.Initialize();
812
813 tempBitmap = modifyParcelBitmapSquare(tempBitmap, start_x, start_y, end_x, end_y, true);
814 return tempBitmap;
815 }
816
817 /// <summary>
818 /// Change a parcel's bitmap at within a square and set those points to a specific value
819 /// </summary>
820 /// <param name="parcel_bitmap"></param>
821 /// <param name="start_x"></param>
822 /// <param name="start_y"></param>
823 /// <param name="end_x"></param>
824 /// <param name="end_y"></param>
825 /// <param name="set_value"></param>
826 /// <returns></returns>
827 public static bool[,] modifyParcelBitmapSquare(bool[,] parcel_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value)
828 {
829 if (parcel_bitmap.GetLength(0) != 64 || parcel_bitmap.GetLength(1) != 64 || parcel_bitmap.Rank != 2)
830 {
831 //Throw an exception - The bitmap is not 64x64
832 throw new Exception("Error: Invalid Parcel Bitmap in modifyParcelBitmapSquare()");
833 }
834
835 int x, y;
836 for (y = 0; y < 64; y++)
837 {
838 for (x = 0; x < 64; x++)
839 {
840 if (x >= start_x / 4 && x < end_x / 4
841 && y >= start_y / 4 && y < end_y / 4)
842 {
843 parcel_bitmap[x, y] = set_value;
844 }
845 }
846 }
847 return parcel_bitmap;
848 }
849 /// <summary>
850 /// Join the true values of 2 bitmaps together
851 /// </summary>
852 /// <param name="bitmap_base"></param>
853 /// <param name="bitmap_add"></param>
854 /// <returns></returns>
855 public static bool[,] mergeParcelBitmaps(bool[,] bitmap_base, bool[,] bitmap_add)
856 {
857 if (bitmap_base.GetLength(0) != 64 || bitmap_base.GetLength(1) != 64 || bitmap_base.Rank != 2)
858 {
859 //Throw an exception - The bitmap is not 64x64
860 throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_base in mergeParcelBitmaps");
861 }
862 if (bitmap_add.GetLength(0) != 64 || bitmap_add.GetLength(1) != 64 || bitmap_add.Rank != 2)
863 {
864 //Throw an exception - The bitmap is not 64x64
865 throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_add in mergeParcelBitmaps");
866
867 }
868
869 int x, y;
870 for (y = 0; y < 64; y++)
871 {
872 for (x = 0; x < 64; x++)
873 {
874 if (bitmap_add[x, y])
875 {
876 bitmap_base[x, y] = true;
877 }
878 }
879 }
880 return bitmap_base;
881 }
882 #endregion
883
884 #endregion
885
886
887 }
888 #endregion
889
890
891}
diff --git a/OpenSim/Region/Environment/RegionManager.cs b/OpenSim/Region/Environment/RegionManager.cs
new file mode 100644
index 0000000..cd67e97
--- /dev/null
+++ b/OpenSim/Region/Environment/RegionManager.cs
@@ -0,0 +1,29 @@
1using System.Collections.Generic;
2using OpenSim.Framework;
3using OpenSim.Framework.Communications;
4using OpenSim.Framework.Servers;
5using OpenSim.Region.Capabilities;
6using OpenSim.Region.Environment.Scenes;
7
8namespace OpenSim.Region.Environment
9{
10 public class RegionManager //needs renaming , but first we need to rename the namespace
11 {
12 protected AuthenticateSessionsBase authenticateHandler;
13 protected RegionCommsListener regionCommsHost;
14 protected CommunicationsManager commsManager;
15 protected List<Caps> capsHandlers = new List<Caps>();
16 protected BaseHttpServer httpListener;
17
18 protected Scene m_Scene;
19
20 public ParcelManager parcelManager;
21 public EstateManager estateManager;
22
23 public RegionManager()
24 {
25
26 }
27
28 }
29}
diff --git a/OpenSim/Region/Environment/Scenes/Entity.cs b/OpenSim/Region/Environment/Scenes/Entity.cs
new file mode 100644
index 0000000..084c9ab
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Entity.cs
@@ -0,0 +1,115 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using libsecondlife;
30using OpenSim.Physics.Manager;
31
32namespace OpenSim.Region.Environment.Scenes
33{
34 public abstract class Entity :EntityBase //this class (Entity) will be phased out
35 {
36 protected PhysicsActor _physActor;
37
38 /// <summary>
39 ///
40 /// </summary>
41 public override LLVector3 Pos
42 {
43 get
44 {
45 if (this._physActor != null)
46 {
47 m_pos.X = _physActor.Position.X;
48 m_pos.Y = _physActor.Position.Y;
49 m_pos.Z = _physActor.Position.Z;
50 }
51
52 return m_pos;
53 }
54 set
55 {
56 if (this._physActor != null)
57 {
58 try
59 {
60 lock (this.m_world.SyncRoot)
61 {
62
63 this._physActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
64 }
65 }
66 catch (Exception e)
67 {
68 Console.WriteLine(e.Message);
69 }
70 }
71
72 m_pos = value;
73 }
74 }
75
76
77 /// <summary>
78 ///
79 /// </summary>
80 public override LLVector3 Velocity
81 {
82 get
83 {
84 if (this._physActor != null)
85 {
86 m_velocity.X = _physActor.Velocity.X;
87 m_velocity.Y = _physActor.Velocity.Y;
88 m_velocity.Z = _physActor.Velocity.Z;
89 }
90
91 return m_velocity;
92 }
93 set
94 {
95 if (this._physActor != null)
96 {
97 try
98 {
99 lock (this.m_world.SyncRoot)
100 {
101
102 this._physActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z);
103 }
104 }
105 catch (Exception e)
106 {
107 Console.WriteLine(e.Message);
108 }
109 }
110
111 m_velocity = value;
112 }
113 }
114 }
115}
diff --git a/OpenSim/Region/Environment/Scenes/EntityBase.cs b/OpenSim/Region/Environment/Scenes/EntityBase.cs
new file mode 100644
index 0000000..65a0395
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/EntityBase.cs
@@ -0,0 +1,142 @@
1using System.Collections.Generic;
2using Axiom.Math;
3using libsecondlife;
4
5namespace OpenSim.Region.Environment.Scenes
6{
7 public abstract class EntityBase
8 {
9 public LLUUID uuid;
10
11 protected List<EntityBase> children;
12
13 protected Scene m_world;
14 protected string m_name;
15
16 /// <summary>
17 ///
18 /// </summary>
19 public virtual string Name
20 {
21 get { return m_name; }
22 set { m_name = value; }
23 }
24
25 protected LLVector3 m_pos;
26 /// <summary>
27 ///
28 /// </summary>
29 public virtual LLVector3 Pos
30 {
31 get
32 {
33 return m_pos;
34 }
35 set
36 {
37 m_pos = value;
38 }
39 }
40
41 public LLVector3 m_velocity;
42
43 /// <summary>
44 ///
45 /// </summary>
46 public virtual LLVector3 Velocity
47 {
48 get
49 {
50 return m_velocity;
51 }
52 set
53 {
54 m_velocity = value;
55 }
56 }
57
58 protected Quaternion m_rotation = new Quaternion(0,0,1,0);
59
60 public virtual Quaternion Rotation
61 {
62 get
63 {
64 return m_rotation;
65 }
66 set
67 {
68 m_rotation = value;
69 }
70 }
71
72 protected uint m_localId;
73
74 public uint LocalId
75 {
76 get { return m_localId; }
77 set { m_localId = value; }
78 }
79
80 /// <summary>
81 /// Creates a new Entity (should not occur on it's own)
82 /// </summary>
83 public EntityBase()
84 {
85 uuid = new LLUUID();
86
87 m_pos = new LLVector3();
88 m_velocity = new LLVector3();
89 Rotation = new Quaternion();
90 m_name = "(basic entity)";
91 children = new List<EntityBase>();
92 }
93
94 /// <summary>
95 ///
96 /// </summary>
97 public virtual void updateMovement()
98 {
99 foreach (EntityBase child in children)
100 {
101 child.updateMovement();
102 }
103 }
104
105 /// <summary>
106 /// Performs any updates that need to be done at each frame. This function is overridable from it's children.
107 /// </summary>
108 public virtual void update()
109 {
110 // Do any per-frame updates needed that are applicable to every type of entity
111 foreach (EntityBase child in children)
112 {
113 child.update();
114 }
115 }
116
117 /// <summary>
118 /// Called at a set interval to inform entities that they should back themsleves up to the DB
119 /// </summary>
120 public virtual void BackUp()
121 {
122
123 }
124
125 /// <summary>
126 /// Copies the entity
127 /// </summary>
128 /// <returns></returns>
129 public virtual EntityBase Copy()
130 {
131 return (EntityBase)this.MemberwiseClone();
132 }
133
134 /// <summary>
135 /// Infoms the entity that the land (heightmap) has changed
136 /// </summary>
137 public virtual void LandRenegerated()
138 {
139
140 }
141 }
142}
diff --git a/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs
new file mode 100644
index 0000000..7c3a033
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs
@@ -0,0 +1,14 @@
1using libsecondlife;
2using libsecondlife.Packets;
3using OpenSim.Framework.Interfaces;
4
5namespace OpenSim.Region.Environment.Scenes
6{
7 public interface IScenePresenceBody
8 {
9 void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation);
10 void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam);
11 void SendOurAppearance(IClientAPI OurClient);
12 void SendAppearanceToOtherAgent(ScenePresence avatarInfo);
13 }
14}
diff --git a/OpenSim/Region/Environment/Scenes/Primitive.cs b/OpenSim/Region/Environment/Scenes/Primitive.cs
new file mode 100644
index 0000000..d23a569
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Primitive.cs
@@ -0,0 +1,594 @@
1using System;
2using System.Collections.Generic;
3using Axiom.Math;
4using libsecondlife;
5using libsecondlife.Packets;
6using OpenSim.Framework.Interfaces;
7using OpenSim.Framework.Inventory;
8using OpenSim.Framework.Types;
9
10namespace OpenSim.Region.Environment.Scenes
11{
12 public class Primitive : EntityBase
13 {
14 private const uint FULL_MASK_PERMISSIONS = 2147483647;
15
16 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
17 private ulong m_regionHandle;
18 private byte updateFlag = 0;
19 private uint m_flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128;
20
21 private Dictionary<LLUUID, InventoryItem> inventoryItems;
22
23 private string m_description = "";
24
25 public string SitName = "";
26 public string TouchName = "";
27 public string Text = "";
28
29 public LLUUID CreatorID;
30 public LLUUID OwnerID;
31 public LLUUID LastOwnerID;
32 public Int32 CreationDate;
33
34 public uint ParentID = 0;
35
36 public uint OwnerMask = FULL_MASK_PERMISSIONS;
37 public uint NextOwnerMask = FULL_MASK_PERMISSIONS;
38 public uint GroupMask = FULL_MASK_PERMISSIONS;
39 public uint EveryoneMask = FULL_MASK_PERMISSIONS;
40 public uint BaseMask = FULL_MASK_PERMISSIONS;
41
42 private PrimitiveBaseShape m_Shape;
43
44 public SceneObject m_RootParent;
45 public bool m_isRootPrim;
46 public EntityBase m_Parent;
47
48 #region Properties
49 /// <summary>
50 /// If rootprim, will return world position
51 /// otherwise will return local offset from rootprim
52 /// </summary>
53 public override LLVector3 Pos
54 {
55 get
56 {
57 if (m_isRootPrim)
58 {
59 //if we are rootprim then our offset should be zero
60 return this.m_pos + m_Parent.Pos;
61 }
62 else
63 {
64 return this.m_pos;
65 }
66 }
67 set
68 {
69 if (m_isRootPrim)
70 {
71 m_Parent.Pos = value;
72 }
73 this.m_pos = value - m_Parent.Pos;
74 }
75
76 }
77
78 public LLVector3 WorldPos
79 {
80 get
81 {
82 if (!this.m_isRootPrim)
83 {
84 Primitive parentPrim = (Primitive)this.m_Parent;
85 Axiom.Math.Vector3 offsetPos = new Vector3(this.m_pos.X, this.m_pos.Y, this.m_pos.Z);
86 offsetPos = parentPrim.Rotation * offsetPos;
87 return parentPrim.WorldPos + new LLVector3(offsetPos.x, offsetPos.y, offsetPos.z);
88 }
89 else
90 {
91 return this.Pos;
92 }
93 }
94 }
95
96 public string Description
97 {
98 get
99 {
100 return this.m_description;
101 }
102 set
103 {
104 this.m_description = value;
105 }
106 }
107
108 public LLVector3 Scale
109 {
110 set
111 {
112 this.m_Shape.Scale = value;
113 }
114 get
115 {
116 return this.m_Shape.Scale;
117 }
118 }
119 #endregion
120
121 #region Constructors
122 /// <summary>
123 ///
124 /// </summary>
125 /// <param name="regionHandle"></param>
126 /// <param name="world"></param>
127 /// <param name="addPacket"></param>
128 /// <param name="ownerID"></param>
129 /// <param name="localID"></param>
130 /// <param name="isRoot"></param>
131 /// <param name="parent"></param>
132 /// <param name="rootObject"></param>
133 public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject)
134 {
135 m_regionHandle = regionHandle;
136 m_world = world;
137 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
138 this.m_Parent = parent;
139 this.m_isRootPrim = isRoot;
140 this.m_RootParent = rootObject;
141 this.CreateFromPacket(addPacket, ownerID, localID);
142 this.Rotation = Axiom.Math.Quaternion.Identity;
143 }
144
145 /// <summary>
146 ///
147 /// </summary>
148 /// <remarks>Empty constructor for duplication</remarks>
149 public Primitive()
150 {
151
152 }
153
154 #endregion
155
156 #region Duplication
157
158 public Primitive Copy(EntityBase parent, SceneObject rootParent)
159 {
160 Primitive dupe = (Primitive)this.MemberwiseClone();
161 // TODO: Copy this properly.
162 dupe.inventoryItems = this.inventoryItems;
163 dupe.m_Parent = parent;
164 dupe.m_RootParent = rootParent;
165 // TODO: Copy this properly.
166 dupe.m_Shape = this.m_Shape;
167
168 uint newLocalID = this.m_world.PrimIDAllocate();
169 dupe.LocalId = newLocalID;
170
171 dupe.Scale = new LLVector3(this.Scale.X, this.Scale.Y, this.Scale.Z);
172 dupe.Rotation = new Quaternion(this.Rotation.w, this.Rotation.x, this.Rotation.y, this.Rotation.z);
173 dupe.Pos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z);
174
175 return dupe;
176 }
177
178 #endregion
179
180
181 #region Override from EntityBase
182 /// <summary>
183 ///
184 /// </summary>
185 public override void update()
186 {
187 if (this.updateFlag == 1) // is a new prim just been created/reloaded or has major changes
188 {
189 this.SendFullUpdateToAllClients();
190 this.updateFlag = 0;
191 }
192 if (this.updateFlag == 2) //some change has been made so update the clients
193 {
194 this.SendTerseUpdateToALLClients();
195 this.updateFlag = 0;
196 }
197
198 foreach (EntityBase child in children)
199 {
200 child.update();
201 }
202 }
203 #endregion
204
205 #region Setup
206 /// <summary>
207 ///
208 /// </summary>
209 /// <param name="addPacket"></param>
210 /// <param name="ownerID"></param>
211 /// <param name="localID"></param>
212 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
213 {
214 this.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
215 this.OwnerID = ownerID;
216 this.CreatorID = this.OwnerID;
217 this.LastOwnerID = LLUUID.Zero;
218 this.Pos = addPacket.ObjectData.RayEnd;
219 this.uuid = LLUUID.Random();
220 this.m_localId = (uint)(localID);
221
222 PrimitiveBaseShape pShape = new PrimitiveBaseShape();
223 this.m_Shape = pShape;
224
225 pShape.PCode = addPacket.ObjectData.PCode;
226 pShape.PathBegin = addPacket.ObjectData.PathBegin;
227 pShape.PathEnd = addPacket.ObjectData.PathEnd;
228 pShape.PathScaleX = addPacket.ObjectData.PathScaleX;
229 pShape.PathScaleY = addPacket.ObjectData.PathScaleY;
230 pShape.PathShearX = addPacket.ObjectData.PathShearX;
231 pShape.PathShearY = addPacket.ObjectData.PathShearY;
232 pShape.PathSkew = addPacket.ObjectData.PathSkew;
233 pShape.ProfileBegin = addPacket.ObjectData.ProfileBegin;
234 pShape.ProfileEnd = addPacket.ObjectData.ProfileEnd;
235 pShape.Scale = addPacket.ObjectData.Scale;
236 pShape.PathCurve = addPacket.ObjectData.PathCurve;
237 pShape.ProfileCurve = addPacket.ObjectData.ProfileCurve;
238 pShape.ProfileHollow = addPacket.ObjectData.ProfileHollow;
239 pShape.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
240 pShape.PathRevolutions = addPacket.ObjectData.PathRevolutions;
241 pShape.PathTaperX = addPacket.ObjectData.PathTaperX;
242 pShape.PathTaperY = addPacket.ObjectData.PathTaperY;
243 pShape.PathTwist = addPacket.ObjectData.PathTwist;
244 pShape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
245
246 this.updateFlag = 1;
247 }
248 #endregion
249
250 #region Linking / unlinking
251 /// <summary>
252 ///
253 /// </summary>
254 /// <param name="linkObject"></param>
255 public void AddNewChildren(SceneObject linkObject)
256 {
257 // Console.WriteLine("linking new prims " + linkObject.rootLocalID + " to me (" + this.LocalId + ")");
258 //TODO check permissions
259 this.children.Add(linkObject.rootPrimitive);
260 linkObject.rootPrimitive.SetNewParent(this, this.m_RootParent);
261
262 this.m_world.DeleteEntity(linkObject.rootUUID);
263 linkObject.DeleteAllChildren();
264 }
265
266 /// <summary>
267 ///
268 /// </summary>
269 /// <param name="newParent"></param>
270 /// <param name="rootParent"></param>
271 public void SetNewParent(Primitive newParent, SceneObject rootParent)
272 {
273 LLVector3 oldPos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z);
274 this.m_isRootPrim = false;
275 this.m_Parent = newParent;
276 this.ParentID = newParent.LocalId;
277 this.m_RootParent = rootParent;
278 this.m_RootParent.AddChildToList(this);
279 this.Pos = oldPos;
280 Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z);
281 axPos = this.m_Parent.Rotation.Inverse() * axPos;
282 this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
283 Axiom.Math.Quaternion oldRot = new Quaternion(this.Rotation.w, this.Rotation.x, this.Rotation.y, this.Rotation.z);
284 this.Rotation = this.m_Parent.Rotation.Inverse() * this.Rotation;
285 this.updateFlag = 1;
286
287 foreach (Primitive child in children)
288 {
289 child.SetRootParent(rootParent, newParent, oldPos, oldRot);
290 }
291 children.Clear();
292
293
294 }
295
296 /// <summary>
297 ///
298 /// </summary>
299 /// <param name="newRoot"></param>
300 public void SetRootParent(SceneObject newRoot , Primitive newParent, LLVector3 oldParentPosition, Axiom.Math.Quaternion oldParentRotation)
301 {
302 LLVector3 oldPos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z);
303 Axiom.Math.Vector3 axOldPos = new Vector3(oldPos.X, oldPos.Y, oldPos.Z);
304 axOldPos = oldParentRotation * axOldPos;
305 oldPos = new LLVector3(axOldPos.x, axOldPos.y, axOldPos.z);
306 oldPos += oldParentPosition;
307 Axiom.Math.Quaternion oldRot = new Quaternion(this.Rotation.w, this.Rotation.x, this.Rotation.y, this.Rotation.z);
308 this.m_isRootPrim = false;
309 this.m_Parent = newParent;
310 this.ParentID = newParent.LocalId;
311 newParent.AddToChildrenList(this);
312 this.m_RootParent = newRoot;
313 this.m_RootParent.AddChildToList(this);
314 this.Pos = oldPos;
315 Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z);
316 axPos = this.m_Parent.Rotation.Inverse() * axPos;
317 this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
318 this.Rotation = oldParentRotation * this.Rotation;
319 this.Rotation = this.m_Parent.Rotation.Inverse()* this.Rotation ;
320 this.updateFlag = 1;
321 foreach (Primitive child in children)
322 {
323 child.SetRootParent(newRoot, newParent, oldPos, oldRot);
324 }
325 children.Clear();
326 }
327
328 /// <summary>
329 ///
330 /// </summary>
331 /// <param name="offset"></param>
332 public void AddOffsetToChildren(LLVector3 offset)
333 {
334 foreach (Primitive prim in this.children)
335 {
336 prim.m_pos += offset;
337 prim.updateFlag = 2;
338 }
339 }
340
341 /// <summary>
342 ///
343 /// </summary>
344 /// <param name="prim"></param>
345 public void AddToChildrenList(Primitive prim)
346 {
347 this.children.Add(prim);
348 }
349 #endregion
350
351 #region Resizing/Scale
352 /// <summary>
353 ///
354 /// </summary>
355 /// <param name="scale"></param>
356 public void ResizeGoup(LLVector3 scale)
357 {
358 LLVector3 offset = (scale - this.m_Shape.Scale);
359 offset.X /= 2;
360 offset.Y /= 2;
361 offset.Z /= 2;
362 if (this.m_isRootPrim)
363 {
364 this.m_Parent.Pos += offset;
365 }
366 else
367 {
368 this.m_pos += offset;
369 }
370
371 this.AddOffsetToChildren(new LLVector3(-offset.X, -offset.Y, -offset.Z));
372 this.m_Shape.Scale = scale;
373
374 this.updateFlag = 1;
375 }
376 #endregion
377
378 #region Position
379 /// <summary>
380 ///
381 /// </summary>
382 /// <param name="pos"></param>
383 public void UpdateGroupPosition(LLVector3 pos)
384 {
385 LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
386
387 this.Pos = newPos;
388 this.updateFlag = 2;
389 }
390
391 /// <summary>
392 ///
393 /// </summary>
394 /// <param name="pos"></param>
395 public void UpdateSinglePosition(LLVector3 pos)
396 {
397 // Console.WriteLine("updating single prim position");
398 if (this.m_isRootPrim)
399 {
400 LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
401 LLVector3 oldPos = new LLVector3(Pos.X, Pos.Y, Pos.Z);
402 LLVector3 diff = oldPos - newPos;
403 Axiom.Math.Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z);
404 axDiff = this.Rotation.Inverse() * axDiff;
405 diff.X = axDiff.x;
406 diff.Y = axDiff.y;
407 diff.Z = axDiff.z;
408 this.Pos = newPos;
409
410 foreach (Primitive prim in this.children)
411 {
412 prim.m_pos += diff;
413 prim.updateFlag = 2;
414 }
415 this.updateFlag = 2;
416 }
417 else
418 {
419 LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
420 this.m_pos = newPos;
421 this.updateFlag = 2;
422 }
423 }
424
425 #endregion
426
427 #region Rotation
428 /// <summary>
429 ///
430 /// </summary>
431 /// <param name="rot"></param>
432 public void UpdateGroupRotation(LLQuaternion rot)
433 {
434 this.Rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
435 this.updateFlag = 2;
436
437 }
438
439 /// <summary>
440 ///
441 /// </summary>
442 /// <param name="pos"></param>
443 /// <param name="rot"></param>
444 public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot)
445 {
446 this.Rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
447 this.Pos = pos;
448 this.updateFlag = 2;
449 }
450
451 /// <summary>
452 ///
453 /// </summary>
454 /// <param name="rot"></param>
455 public void UpdateSingleRotation(LLQuaternion rot)
456 {
457 //Console.WriteLine("updating single prim rotation");
458 Axiom.Math.Quaternion axRot = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
459 Axiom.Math.Quaternion oldParentRot = new Quaternion(this.Rotation.w, this.Rotation.x, this.Rotation.y, this.Rotation.z);
460 this.Rotation = axRot;
461 foreach (Primitive prim in this.children)
462 {
463 Axiom.Math.Vector3 axPos = new Vector3(prim.m_pos.X, prim.m_pos.Y, prim.m_pos.Z);
464 axPos = oldParentRot * axPos;
465 axPos = axRot.Inverse() * axPos;
466 prim.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
467 prim.Rotation = oldParentRot * prim.Rotation ;
468 prim.Rotation = axRot.Inverse()* prim.Rotation;
469 prim.updateFlag = 2;
470 }
471 this.updateFlag = 2;
472 }
473 #endregion
474
475 #region Shape
476 /// <summary>
477 ///
478 /// </summary>
479 /// <param name="shapeBlock"></param>
480 public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
481 {
482 this.m_Shape.PathBegin = shapeBlock.PathBegin;
483 this.m_Shape.PathEnd = shapeBlock.PathEnd;
484 this.m_Shape.PathScaleX = shapeBlock.PathScaleX;
485 this.m_Shape.PathScaleY = shapeBlock.PathScaleY;
486 this.m_Shape.PathShearX = shapeBlock.PathShearX;
487 this.m_Shape.PathShearY = shapeBlock.PathShearY;
488 this.m_Shape.PathSkew = shapeBlock.PathSkew;
489 this.m_Shape.ProfileBegin = shapeBlock.ProfileBegin;
490 this.m_Shape.ProfileEnd = shapeBlock.ProfileEnd;
491 this.m_Shape.PathCurve = shapeBlock.PathCurve;
492 this.m_Shape.ProfileCurve = shapeBlock.ProfileCurve;
493 this.m_Shape.ProfileHollow = shapeBlock.ProfileHollow;
494 this.m_Shape.PathRadiusOffset = shapeBlock.PathRadiusOffset;
495 this.m_Shape.PathRevolutions = shapeBlock.PathRevolutions;
496 this.m_Shape.PathTaperX = shapeBlock.PathTaperX;
497 this.m_Shape.PathTaperY = shapeBlock.PathTaperY;
498 this.m_Shape.PathTwist = shapeBlock.PathTwist;
499 this.m_Shape.PathTwistBegin = shapeBlock.PathTwistBegin;
500 this.updateFlag = 1;
501 }
502 #endregion
503
504 #region Client Update Methods
505
506 /// <summary>
507 ///
508 /// </summary>
509 /// <param name="remoteClient"></param>
510 public void SendFullUpdateForAllChildren(IClientAPI remoteClient)
511 {
512 this.SendFullUpdateToClient(remoteClient);
513 for (int i = 0; i < this.children.Count; i++)
514 {
515 if (this.children[i] is Primitive)
516 {
517 ((Primitive)this.children[i]).SendFullUpdateForAllChildren(remoteClient);
518 }
519 }
520 }
521
522 /// <summary>
523 ///
524 /// </summary>
525 /// <param name="remoteClient"></param>
526 public void SendFullUpdateToClient(IClientAPI remoteClient)
527 {
528 LLVector3 lPos;
529 lPos = this.Pos;
530 LLQuaternion lRot;
531 lRot = new LLQuaternion(this.Rotation.x, this.Rotation.y, this.Rotation.z, this.Rotation.w);
532
533 remoteClient.SendPrimitiveToClient(this.m_regionHandle, 64096, this.LocalId, this.m_Shape, lPos, lRot, new LLUUID("00000000-0000-0000-9999-000000000005"), this.m_flags, this.uuid, this.OwnerID, this.Text, this.ParentID);
534 }
535
536 /// <summary>
537 ///
538 /// </summary>
539 public void SendFullUpdateToAllClients()
540 {
541 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
542 for (int i = 0; i < avatars.Count; i++)
543 {
544 this.SendFullUpdateToClient(avatars[i].ControllingClient);
545 }
546 }
547
548 /// <summary>
549 ///
550 /// </summary>
551 /// <param name="remoteClient"></param>
552 public void SendTerseUpdateForAllChildren(IClientAPI remoteClient)
553 {
554 this.SendTerseUpdateToClient(remoteClient);
555 for (int i = 0; i < this.children.Count; i++)
556 {
557 if (this.children[i] is Primitive)
558 {
559 ((Primitive)this.children[i]).SendTerseUpdateForAllChildren(remoteClient);
560 }
561 }
562 }
563
564 /// <summary>
565 ///
566 /// </summary>
567 /// <param name="RemoteClient"></param>
568 public void SendTerseUpdateToClient(IClientAPI RemoteClient)
569 {
570 LLVector3 lPos;
571 Quaternion lRot;
572
573 lPos = this.Pos;
574 lRot = this.Rotation;
575
576 LLQuaternion mRot = new LLQuaternion(lRot.x, lRot.y, lRot.z, lRot.w);
577 RemoteClient.SendPrimTerseUpdate(this.m_regionHandle, 64096, this.LocalId, lPos, mRot);
578 }
579
580 /// <summary>
581 ///
582 /// </summary>
583 public void SendTerseUpdateToALLClients()
584 {
585 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
586 for (int i = 0; i < avatars.Count; i++)
587 {
588 this.SendTerseUpdateToClient(avatars[i].ControllingClient);
589 }
590 }
591
592 #endregion
593 }
594}
diff --git a/OpenSim/Region/Environment/Scenes/PrimitiveOld.cs b/OpenSim/Region/Environment/Scenes/PrimitiveOld.cs
new file mode 100644
index 0000000..91a4162
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/PrimitiveOld.cs
@@ -0,0 +1,583 @@
1
2/*
3* Copyright (c) Contributors, http://www.openmetaverse.org/
4* See CONTRIBUTORS.TXT for a full list of copyright holders.
5*
6* Redistribution and use in source and binary forms, with or without
7* modification, are permitted provided that the following conditions are met:
8* * Redistributions of source code must retain the above copyright
9* notice, this list of conditions and the following disclaimer.
10* * Redistributions in binary form must reproduce the above copyright
11* notice, this list of conditions and the following disclaimer in the
12* documentation and/or other materials provided with the distribution.
13* * Neither the name of the OpenSim Project nor the
14* names of its contributors may be used to endorse or promote products
15* derived from this software without specific prior written permission.
16*
17* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
18* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
21* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*
28*/
29using System;
30using System.Collections.Generic;
31using System.Text;
32using Axiom.Math;
33using libsecondlife;
34using libsecondlife.Packets;
35using OpenSim.Framework.Interfaces;
36using OpenSim.Framework.Inventory;
37using OpenSim.Framework.Types;
38using OpenSim.Physics.Manager;
39
40namespace OpenSim.Region.Environment.Scenes
41{
42 public class PrimitiveOld : Entity
43 {
44 internal PrimData primData;
45 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
46 // private ClientManager m_clientThreads;
47 private ulong m_regionHandle;
48 private const uint FULL_MASK_PERMISSIONS = 2147483647;
49 private bool physicsEnabled = false;
50 private byte updateFlag = 0;
51 private uint flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128;
52
53 private Dictionary<LLUUID, InventoryItem> inventoryItems;
54
55 #region Properties
56
57 public LLVector3 Scale
58 {
59 set
60 {
61 this.primData.Scale = value;
62 //this.dirtyFlag = true;
63 }
64 get
65 {
66 return this.primData.Scale;
67 }
68 }
69
70 public PhysicsActor PhysActor
71 {
72 set
73 {
74 this._physActor = value;
75 }
76 }
77
78 public override LLVector3 Pos
79 {
80 get
81 {
82 return base.Pos;
83 }
84 set
85 {
86 base.Pos = value;
87 }
88 }
89 #endregion
90
91 /// <summary>
92 ///
93 /// </summary>
94 /// <param name="clientThreads"></param>
95 /// <param name="regionHandle"></param>
96 /// <param name="world"></param>
97 public PrimitiveOld( ulong regionHandle, Scene world)
98 {
99 // m_clientThreads = clientThreads;
100 m_regionHandle = regionHandle;
101 m_world = world;
102 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
103 }
104
105 /// <summary>
106 ///
107 /// </summary>
108 /// <param name="regionHandle"></param>
109 /// <param name="world"></param>
110 /// <param name="addPacket"></param>
111 /// <param name="ownerID"></param>
112 /// <param name="localID"></param>
113 public PrimitiveOld(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
114 {
115 // m_clientThreads = clientThreads;
116 m_regionHandle = regionHandle;
117 m_world = world;
118 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
119 this.CreateFromPacket(addPacket, ownerID, localID);
120 }
121
122 /// <summary>
123 ///
124 /// </summary>
125 /// <param name="clientThreads"></param>
126 /// <param name="regionHandle"></param>
127 /// <param name="world"></param>
128 /// <param name="owner"></param>
129 /// <param name="fullID"></param>
130 /// <param name="localID"></param>
131 public PrimitiveOld( ulong regionHandle, Scene world, LLUUID owner, LLUUID fullID, uint localID)
132 {
133 // m_clientThreads = clientThreads;
134 m_regionHandle = regionHandle;
135 m_world = world;
136 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
137 this.primData = new PrimData();
138 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
139 this.primData.OwnerID = owner;
140 this.primData.FullID = this.uuid = fullID;
141 this.primData.LocalID = m_localId = localID;
142 }
143
144 /// <summary>
145 /// Constructor to create a default cube
146 /// </summary>
147 /// <param name="clientThreads"></param>
148 /// <param name="regionHandle"></param>
149 /// <param name="world"></param>
150 /// <param name="owner"></param>
151 /// <param name="localID"></param>
152 /// <param name="position"></param>
153 public PrimitiveOld( ulong regionHandle, Scene world, LLUUID owner, uint localID, LLVector3 position)
154 {
155 //m_clientThreads = clientThreads;
156 m_regionHandle = regionHandle;
157 m_world = world;
158 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
159 this.primData = PrimData.DefaultCube();
160 this.primData.OwnerID = owner;
161 this.primData.LocalID = m_localId = localID;
162 this.Pos = this.primData.Position = position;
163
164 this.updateFlag = 1;
165 }
166
167 /// <summary>
168 ///
169 /// </summary>
170 /// <returns></returns>
171 public byte[] GetByteArray()
172 {
173 byte[] result = null;
174 List<byte[]> dataArrays = new List<byte[]>();
175 dataArrays.Add(primData.ToBytes());
176 foreach (Entity child in children)
177 {
178 if (child is PrimitiveOld)
179 {
180 dataArrays.Add(((PrimitiveOld)child).GetByteArray());
181 }
182 }
183 byte[] primstart = Helpers.StringToField("<Prim>");
184 byte[] primend = Helpers.StringToField("</Prim>");
185 int totalLength = primstart.Length + primend.Length;
186 for (int i = 0; i < dataArrays.Count; i++)
187 {
188 totalLength += dataArrays[i].Length;
189 }
190
191 result = new byte[totalLength];
192 int arraypos = 0;
193 Array.Copy(primstart, 0, result, 0, primstart.Length);
194 arraypos += primstart.Length;
195 for (int i = 0; i < dataArrays.Count; i++)
196 {
197 Array.Copy(dataArrays[i], 0, result, arraypos, dataArrays[i].Length);
198 arraypos += dataArrays[i].Length;
199 }
200 Array.Copy(primend, 0, result, arraypos, primend.Length);
201
202 return result;
203 }
204
205 #region Overridden Methods
206
207 /// <summary>
208 ///
209 /// </summary>
210 public override void update()
211 {
212 if (this.updateFlag == 1) // is a new prim just been created/reloaded
213 {
214 this.SendFullUpdateToAllClients();
215 this.updateFlag = 0;
216 }
217 if (this.updateFlag == 2) //some change has been made so update the clients
218 {
219 this.SendTerseUpdateToALLClients();
220 this.updateFlag = 0;
221 }
222 }
223
224 /// <summary>
225 ///
226 /// </summary>
227 public override void BackUp()
228 {
229
230 }
231
232 #endregion
233
234 #region Packet handlers
235
236 /// <summary>
237 ///
238 /// </summary>
239 /// <param name="pos"></param>
240 public void UpdatePosition(LLVector3 pos)
241 {
242 this.Pos = new LLVector3(pos.X, pos.Y, pos.Z);
243 this.updateFlag = 2;
244 }
245
246 /// <summary>
247 ///
248 /// </summary>
249 /// <param name="addPacket"></param>
250 public void UpdateShape(ObjectShapePacket.ObjectDataBlock updatePacket)
251 {
252 this.primData.PathBegin = updatePacket.PathBegin;
253 this.primData.PathEnd = updatePacket.PathEnd;
254 this.primData.PathScaleX = updatePacket.PathScaleX;
255 this.primData.PathScaleY = updatePacket.PathScaleY;
256 this.primData.PathShearX = updatePacket.PathShearX;
257 this.primData.PathShearY = updatePacket.PathShearY;
258 this.primData.PathSkew = updatePacket.PathSkew;
259 this.primData.ProfileBegin = updatePacket.ProfileBegin;
260 this.primData.ProfileEnd = updatePacket.ProfileEnd;
261 this.primData.PathCurve = updatePacket.PathCurve;
262 this.primData.ProfileCurve = updatePacket.ProfileCurve;
263 this.primData.ProfileHollow = updatePacket.ProfileHollow;
264 this.primData.PathRadiusOffset = updatePacket.PathRadiusOffset;
265 this.primData.PathRevolutions = updatePacket.PathRevolutions;
266 this.primData.PathTaperX = updatePacket.PathTaperX;
267 this.primData.PathTaperY = updatePacket.PathTaperY;
268 this.primData.PathTwist = updatePacket.PathTwist;
269 this.primData.PathTwistBegin = updatePacket.PathTwistBegin;
270 }
271
272 /// <summary>
273 ///
274 /// </summary>
275 /// <param name="tex"></param>
276 public void UpdateTexture(byte[] tex)
277 {
278 this.primData.TextureEntry = tex;
279 }
280
281 /// <summary>
282 ///
283 /// </summary>
284 /// <param name="pack"></param>
285 public void UpdateObjectFlags(ObjectFlagUpdatePacket pack)
286 {
287
288 }
289
290 /// <summary>
291 ///
292 /// </summary>
293 /// <param name="prim"></param>
294 public void AssignToParent(PrimitiveOld prim)
295 {
296
297 }
298
299 #endregion
300
301 # region Inventory Methods
302 /// <summary>
303 ///
304 /// </summary>
305 /// <param name="item"></param>
306 /// <returns></returns>
307 public bool AddToInventory(InventoryItem item)
308 {
309 return false;
310 }
311
312 /// <summary>
313 ///
314 /// </summary>
315 /// <param name="itemID"></param>
316 /// <returns></returns>
317 public InventoryItem RemoveFromInventory(LLUUID itemID)
318 {
319 return null;
320 }
321
322 /// <summary>
323 ///
324 /// </summary>
325 /// <param name="simClient"></param>
326 /// <param name="packet"></param>
327 public void RequestInventoryInfo(IClientAPI simClient, RequestTaskInventoryPacket packet)
328 {
329
330 }
331
332 /// <summary>
333 ///
334 /// </summary>
335 /// <param name="simClient"></param>
336 /// <param name="xferID"></param>
337 public void RequestXferInventory(IClientAPI simClient, ulong xferID)
338 {
339 //will only currently work if the total size of the inventory data array is under about 1000 bytes
340 SendXferPacketPacket send = new SendXferPacketPacket();
341
342 send.XferID.ID = xferID;
343 send.XferID.Packet = 1 + 2147483648;
344 send.DataPacket.Data = this.ConvertInventoryToBytes();
345
346 simClient.OutPacket(send);
347 }
348
349 /// <summary>
350 ///
351 /// </summary>
352 /// <returns></returns>
353 public byte[] ConvertInventoryToBytes()
354 {
355 Encoding enc = Encoding.ASCII;
356 byte[] result = new byte[0];
357 List<byte[]> inventoryData = new List<byte[]>();
358 int totallength = 0;
359 foreach (InventoryItem invItem in inventoryItems.Values)
360 {
361 byte[] data = enc.GetBytes(invItem.ExportString());
362 inventoryData.Add(data);
363 totallength += data.Length;
364 }
365 //TODO: copy arrays into the single result array
366
367 return result;
368 }
369
370 /// <summary>
371 ///
372 /// </summary>
373 /// <param name="data"></param>
374 public void CreateInventoryFromBytes(byte[] data)
375 {
376
377 }
378
379 #endregion
380
381 #region Update viewers Methods
382
383 /// <summary>
384 ///
385 /// </summary>
386 /// <param name="remoteClient"></param>
387 public void SendFullUpdateForAllChildren(IClientAPI remoteClient)
388 {
389 this.SendFullUpdateToClient(remoteClient);
390 for (int i = 0; i < this.children.Count; i++)
391 {
392 if (this.children[i] is PrimitiveOld)
393 {
394 ((PrimitiveOld)this.children[i]).SendFullUpdateForAllChildren(remoteClient);
395 }
396 }
397 }
398
399 /// <summary>
400 ///
401 /// </summary>
402 /// <param name="remoteClient"></param>
403 public void SendFullUpdateToClient(IClientAPI remoteClient)
404 {
405 LLVector3 lPos;
406 if (this._physActor != null && this.physicsEnabled)
407 {
408 PhysicsVector pPos = this._physActor.Position;
409 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
410 }
411 else
412 {
413 lPos = this.Pos;
414 }
415
416 remoteClient.SendPrimitiveToClient(this.m_regionHandle, 64096, this.LocalId, this.primData, lPos, new LLUUID("00000000-0000-0000-9999-000000000005"), this.flags);
417 }
418
419 /// <summary>
420 ///
421 /// </summary>
422 public void SendFullUpdateToAllClients()
423 {
424 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
425 for (int i = 0; i < avatars.Count; i++)
426 {
427 this.SendFullUpdateToClient(avatars[i].ControllingClient);
428 }
429 }
430
431 /// <summary>
432 ///
433 /// </summary>
434 /// <param name="RemoteClient"></param>
435 public void SendTerseUpdateToClient(IClientAPI RemoteClient)
436 {
437 LLVector3 lPos;
438 Quaternion lRot;
439 if (this._physActor != null && this.physicsEnabled) //is this needed ? doesn't the property fields do this for us?
440 {
441 PhysicsVector pPos = this._physActor.Position;
442 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
443 lRot = this._physActor.Orientation;
444 }
445 else
446 {
447 lPos = this.Pos;
448 lRot = this.Rotation;
449 }
450 LLQuaternion mRot = new LLQuaternion(lRot.x, lRot.y, lRot.z, lRot.w);
451 RemoteClient.SendPrimTerseUpdate(this.m_regionHandle, 64096, this.LocalId, lPos, mRot);
452 }
453
454 /// <summary>
455 ///
456 /// </summary>
457 public void SendTerseUpdateToALLClients()
458 {
459 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
460 for (int i = 0; i < avatars.Count; i++)
461 {
462 this.SendTerseUpdateToClient(avatars[i].ControllingClient);
463 }
464 }
465
466 #endregion
467
468 #region Create Methods
469
470 /// <summary>
471 ///
472 /// </summary>
473 /// <param name="addPacket"></param>
474 /// <param name="ownerID"></param>
475 /// <param name="localID"></param>
476 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
477 {
478 PrimData PData = new PrimData();
479 this.primData = PData;
480 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
481
482 PData.OwnerID = ownerID;
483 PData.PCode = addPacket.ObjectData.PCode;
484 PData.PathBegin = addPacket.ObjectData.PathBegin;
485 PData.PathEnd = addPacket.ObjectData.PathEnd;
486 PData.PathScaleX = addPacket.ObjectData.PathScaleX;
487 PData.PathScaleY = addPacket.ObjectData.PathScaleY;
488 PData.PathShearX = addPacket.ObjectData.PathShearX;
489 PData.PathShearY = addPacket.ObjectData.PathShearY;
490 PData.PathSkew = addPacket.ObjectData.PathSkew;
491 PData.ProfileBegin = addPacket.ObjectData.ProfileBegin;
492 PData.ProfileEnd = addPacket.ObjectData.ProfileEnd;
493 PData.Scale = addPacket.ObjectData.Scale;
494 PData.PathCurve = addPacket.ObjectData.PathCurve;
495 PData.ProfileCurve = addPacket.ObjectData.ProfileCurve;
496 PData.ParentID = 0;
497 PData.ProfileHollow = addPacket.ObjectData.ProfileHollow;
498 PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
499 PData.PathRevolutions = addPacket.ObjectData.PathRevolutions;
500 PData.PathTaperX = addPacket.ObjectData.PathTaperX;
501 PData.PathTaperY = addPacket.ObjectData.PathTaperY;
502 PData.PathTwist = addPacket.ObjectData.PathTwist;
503 PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
504 LLVector3 pos1 = addPacket.ObjectData.RayEnd;
505 this.primData.FullID = this.uuid = LLUUID.Random();
506 this.primData.LocalID = m_localId = (uint)(localID);
507 this.primData.Position = this.Pos = pos1;
508
509 this.updateFlag = 1;
510 }
511
512 /// <summary>
513 ///
514 /// </summary>
515 /// <param name="data"></param>
516 public void CreateFromBytes(byte[] data)
517 {
518
519 }
520
521 /// <summary>
522 ///
523 /// </summary>
524 /// <param name="primData"></param>
525 public void CreateFromPrimData(PrimData primData)
526 {
527 this.CreateFromPrimData(primData, primData.Position, primData.LocalID, false);
528 }
529
530 /// <summary>
531 ///
532 /// </summary>
533 /// <param name="primData"></param>
534 /// <param name="posi"></param>
535 /// <param name="localID"></param>
536 /// <param name="newprim"></param>
537 public void CreateFromPrimData(PrimData primData, LLVector3 posi, uint localID, bool newprim)
538 {
539
540 }
541
542 public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
543 {
544 // Console.WriteLine("moving prim to new location " + pos.X + " , " + pos.Y + " , " + pos.Z);
545 this.Pos = pos;
546 this.SendTerseUpdateToALLClients();
547 }
548
549 public void GetProperites(IClientAPI client)
550 {
551 //needs changing
552 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
553 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
554 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
555 proper.ObjectData[0].ItemID = LLUUID.Zero;
556 proper.ObjectData[0].CreationDate = (ulong)primData.CreationDate;
557 proper.ObjectData[0].CreatorID = primData.OwnerID;
558 proper.ObjectData[0].FolderID = LLUUID.Zero;
559 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
560 proper.ObjectData[0].GroupID = LLUUID.Zero;
561 proper.ObjectData[0].InventorySerial = 0;
562 proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
563 proper.ObjectData[0].ObjectID = this.uuid;
564 proper.ObjectData[0].OwnerID = primData.OwnerID;
565 proper.ObjectData[0].TouchName = new byte[0];
566 proper.ObjectData[0].TextureID = new byte[0];
567 proper.ObjectData[0].SitName = new byte[0];
568 proper.ObjectData[0].Name = new byte[0];
569 proper.ObjectData[0].Description = new byte[0];
570 proper.ObjectData[0].OwnerMask = primData.OwnerMask;
571 proper.ObjectData[0].NextOwnerMask = primData.NextOwnerMask;
572 proper.ObjectData[0].GroupMask = primData.GroupMask;
573 proper.ObjectData[0].EveryoneMask = primData.EveryoneMask;
574 proper.ObjectData[0].BaseMask = primData.BaseMask;
575
576 client.OutPacket(proper);
577
578 }
579
580 #endregion
581
582 }
583}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
new file mode 100644
index 0000000..69eaa75
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
@@ -0,0 +1,570 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using libsecondlife;
31using libsecondlife.Packets;
32using OpenSim.Framework.Interfaces;
33using OpenSim.Framework.Types;
34
35namespace OpenSim.Region.Environment.Scenes
36{
37 public partial class Scene
38 {
39 /// <summary>
40 /// Modifies terrain using the specified information
41 /// </summary>
42 /// <param name="height">The height at which the user started modifying the terrain</param>
43 /// <param name="seconds">The number of seconds the modify button was pressed</param>
44 /// <param name="brushsize">The size of the brush used</param>
45 /// <param name="action">The action to be performed</param>
46 /// <param name="north">Distance from the north border where the cursor is located</param>
47 /// <param name="west">Distance from the west border where the cursor is located</param>
48 public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west)
49 {
50 // Shiny.
51 double size = (double)(1 << brushsize);
52
53 switch (action)
54 {
55 case 0:
56 // flatten terrain
57 Terrain.flatten(north, west, size, (double)seconds / 100.0);
58 RegenerateTerrain(true, (int)north, (int)west);
59 break;
60 case 1:
61 // raise terrain
62 Terrain.raise(north, west, size, (double)seconds / 100.0);
63 RegenerateTerrain(true, (int)north, (int)west);
64 break;
65 case 2:
66 //lower terrain
67 Terrain.lower(north, west, size, (double)seconds / 100.0);
68 RegenerateTerrain(true, (int)north, (int)west);
69 break;
70 case 3:
71 // smooth terrain
72 Terrain.smooth(north, west, size, (double)seconds / 100.0);
73 RegenerateTerrain(true, (int)north, (int)west);
74 break;
75 case 4:
76 // noise
77 Terrain.noise(north, west, size, (double)seconds / 100.0);
78 RegenerateTerrain(true, (int)north, (int)west);
79 break;
80 case 5:
81 // revert
82 Terrain.revert(north, west, size, (double)seconds / 100.0);
83 RegenerateTerrain(true, (int)north, (int)west);
84 break;
85
86 // CLIENT EXTENSIONS GO HERE
87 case 128:
88 // erode-thermal
89 break;
90 case 129:
91 // erode-aerobic
92 break;
93 case 130:
94 // erode-hydraulic
95 break;
96 }
97 return;
98 }
99
100 /// <summary>
101 ///
102 /// </summary>
103 /// <remarks>Inefficient. TODO: Fixme</remarks>
104 /// <param name="fromAgentID"></param>
105 /// <param name="toAgentID"></param>
106 /// <param name="timestamp"></param>
107 /// <param name="fromAgentName"></param>
108 /// <param name="message"></param>
109 public void InstantMessage(LLUUID fromAgentID, LLUUID toAgentID, uint timestamp, string fromAgentName, string message)
110 {
111 if (this.Avatars.ContainsKey(toAgentID))
112 {
113 if (this.Avatars.ContainsKey(fromAgentID))
114 {
115 // Local sim message
116 ScenePresence avatar = this.Avatars[fromAgentID];
117 avatar.ControllingClient.SendInstantMessage(message, toAgentID);
118 }
119 else
120 {
121 // Message came from a user outside the sim, ignore?
122 }
123 }
124 else
125 {
126 // Grid message
127 }
128 }
129
130 /// <summary>
131 ///
132 /// </summary>
133 /// <param name="message"></param>
134 /// <param name="type"></param>
135 /// <param name="fromPos"></param>
136 /// <param name="fromName"></param>
137 /// <param name="fromAgentID"></param>
138 public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
139 {
140 // Console.WriteLine("Chat message");
141 ScenePresence avatar = null;
142
143 m_clientManager.ForEachClient(delegate(IClientAPI client)
144 {
145 int dis = -1000;
146 if (this.Avatars.ContainsKey(client.AgentId))
147 {
148 avatar = this.Avatars[client.AgentId];
149 // int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y));
150 dis = (int) avatar.Pos.GetDistanceTo(fromPos);
151 //Console.WriteLine("found avatar at " +dis);
152 }
153
154 switch (type)
155 {
156 case 0: // Whisper
157 if ((dis < 10) && (dis > -10))
158 {
159 //should change so the message is sent through the avatar rather than direct to the ClientView
160 client.SendChatMessage(message, type, fromPos, fromName,
161 fromAgentID);
162 }
163 break;
164 case 1: // Say
165 if ((dis < 30) && (dis > -30))
166 {
167 //Console.WriteLine("sending chat");
168 client.SendChatMessage(message, type, fromPos, fromName,
169 fromAgentID);
170 }
171 break;
172 case 2: // Shout
173 if ((dis < 100) && (dis > -100))
174 {
175 client.SendChatMessage(message, type, fromPos, fromName,
176 fromAgentID);
177 }
178 break;
179
180 case 0xff: // Broadcast
181 client.SendChatMessage(message, type, fromPos, fromName,
182 fromAgentID);
183 break;
184 }
185 });
186 }
187
188 /// <summary>
189 ///
190 /// </summary>
191 /// <param name="primAsset"></param>
192 /// <param name="pos"></param>
193 public void RezObject(AssetBase primAsset, LLVector3 pos)
194 {
195
196 }
197
198 /// <summary>
199 ///
200 /// </summary>
201 /// <param name="packet"></param>
202 /// <param name="simClient"></param>
203 public void DeRezObject(Packet packet, IClientAPI simClient)
204 {
205
206 }
207
208 /// <summary>
209 ///
210 /// </summary>
211 /// <param name="remoteClient"></param>
212 public void SendAvatarsToClient(IClientAPI remoteClient)
213 {
214
215 }
216
217 /// <summary>
218 ///
219 /// </summary>
220 /// <param name="originalPrim"></param>
221 /// <param name="offset"></param>
222 /// <param name="flags"></param>
223 public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags)
224 {
225 SceneObject originPrim = null;
226 foreach (EntityBase ent in Entities.Values)
227 {
228 if (ent is SceneObject)
229 {
230 if (((SceneObject)ent).rootLocalID == originalPrim)
231 {
232 originPrim = (SceneObject)ent;
233 break;
234 }
235 }
236 }
237
238 if (originPrim != null)
239 {
240 //SceneObject copy = originPrim.Copy();
241
242 }
243 else
244 {
245 OpenSim.Framework.Console.MainLog.Instance.Warn("Attempted to duplicate nonexistant prim");
246 }
247
248 }
249
250 /// <summary>
251 ///
252 /// </summary>
253 /// <param name="parentPrim"></param>
254 /// <param name="childPrims"></param>
255 public void LinkObjects(uint parentPrim, List<uint> childPrims)
256 {
257 SceneObject parenPrim = null;
258 foreach (EntityBase ent in Entities.Values)
259 {
260 if (ent is SceneObject)
261 {
262 if (((SceneObject)ent).rootLocalID == parentPrim)
263 {
264 parenPrim = (SceneObject)ent;
265 break;
266 }
267 }
268 }
269
270 List<SceneObject> children = new List<SceneObject>();
271 if (parenPrim != null)
272 {
273 for (int i = 0; i < childPrims.Count; i++)
274 {
275 foreach (EntityBase ent in Entities.Values)
276 {
277 if (ent is SceneObject)
278 {
279 if (((SceneObject)ent).rootLocalID == childPrims[i])
280 {
281 children.Add((SceneObject)ent);
282 }
283 }
284 }
285 }
286 }
287
288 foreach (SceneObject sceneObj in children)
289 {
290 parenPrim.AddNewChildPrims(sceneObj);
291 }
292 }
293
294 /// <summary>
295 ///
296 /// </summary>
297 /// <param name="primLocalID"></param>
298 /// <param name="shapeBlock"></param>
299 public void UpdatePrimShape(uint primLocalID, ObjectShapePacket.ObjectDataBlock shapeBlock)
300 {
301 Primitive prim = null;
302 foreach (EntityBase ent in Entities.Values)
303 {
304 if (ent is SceneObject)
305 {
306 prim = ((SceneObject)ent).HasChildPrim(primLocalID);
307 if (prim != null)
308 {
309 prim.UpdateShape(shapeBlock);
310 break;
311 }
312 }
313 }
314 }
315
316 /// <summary>
317 ///
318 /// </summary>
319 /// <param name="primLocalID"></param>
320 /// <param name="remoteClient"></param>
321 public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
322 {
323 foreach (EntityBase ent in Entities.Values)
324 {
325 if (ent is SceneObject)
326 {
327 if (((SceneObject)ent).rootLocalID == primLocalID)
328 {
329 ((SceneObject)ent).GetProperites(remoteClient);
330 break;
331 }
332 }
333 }
334 }
335
336 /// <summary>
337 ///
338 /// </summary>
339 /// <param name="primLocalID"></param>
340 /// <param name="description"></param>
341 public void PrimDescription(uint primLocalID, string description)
342 {
343 Primitive prim = null;
344 foreach (EntityBase ent in Entities.Values)
345 {
346 if (ent is SceneObject)
347 {
348 prim = ((SceneObject)ent).HasChildPrim(primLocalID);
349 if (prim != null)
350 {
351 prim.Description = description;
352 break;
353 }
354 }
355 }
356 }
357
358 /// <summary>
359 ///
360 /// </summary>
361 /// <param name="primLocalID"></param>
362 /// <param name="description"></param>
363 public void PrimName(uint primLocalID, string name)
364 {
365 Primitive prim = null;
366 foreach (EntityBase ent in Entities.Values)
367 {
368 if (ent is SceneObject)
369 {
370 prim = ((SceneObject)ent).HasChildPrim(primLocalID);
371 if (prim != null)
372 {
373 prim.Name = name;
374 break;
375 }
376 }
377 }
378 }
379
380 public void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
381 {
382 Primitive prim = null;
383 foreach (EntityBase ent in Entities.Values)
384 {
385 if (ent is SceneObject)
386 {
387 prim = ((SceneObject)ent).HasChildPrim(objectID);
388 if (prim != null)
389 {
390 ((SceneObject)ent).GrapMovement(offset, pos, remoteClient);
391 break;
392 }
393 }
394 }
395 /*
396 if (this.Entities.ContainsKey(objectID))
397 {
398 if (this.Entities[objectID] is SceneObject)
399 {
400 ((SceneObject)this.Entities[objectID]).GrapMovement(offset, pos, remoteClient);
401 }
402 }*/
403 }
404
405 /// <summary>
406 ///
407 /// </summary>
408 /// <param name="localID"></param>
409 /// <param name="packet"></param>
410 /// <param name="remoteClient"></param>
411 public void UpdatePrimFlags(uint localID, Packet packet, IClientAPI remoteClient)
412 {
413
414 }
415
416 /// <summary>
417 ///
418 /// </summary>
419 /// <param name="localID"></param>
420 /// <param name="texture"></param>
421 /// <param name="remoteClient"></param>
422 public void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient)
423 {
424
425 }
426
427 /// <summary>
428 ///
429 /// </summary>
430 /// <param name="localID"></param>
431 /// <param name="pos"></param>
432 /// <param name="remoteClient"></param>
433 public void UpdatePrimPosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
434 {
435 Primitive prim = null;
436 foreach (EntityBase ent in Entities.Values)
437 {
438 if (ent is SceneObject)
439 {
440 prim = ((SceneObject)ent).HasChildPrim(localID);
441 if (prim != null)
442 {
443 prim.UpdateGroupPosition(pos);
444 break;
445 }
446 }
447 }
448 }
449
450 public void UpdatePrimSinglePosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
451 {
452 Primitive prim = null;
453 foreach (EntityBase ent in Entities.Values)
454 {
455 if (ent is SceneObject)
456 {
457 prim = ((SceneObject)ent).HasChildPrim(localID);
458 if (prim != null)
459 {
460 prim.UpdateSinglePosition(pos);
461 break;
462 }
463 }
464 }
465 }
466
467 /// <summary>
468 ///
469 /// </summary>
470 /// <param name="localID"></param>
471 /// <param name="pos"></param>
472 /// <param name="rot"></param>
473 /// <param name="remoteClient"></param>
474 public void UpdatePrimRotation(uint localID, LLVector3 pos, LLQuaternion rot, IClientAPI remoteClient)
475 {
476 Primitive prim = null;
477 foreach (EntityBase ent in Entities.Values)
478 {
479 if (ent is SceneObject)
480 {
481 prim = ((SceneObject)ent).HasChildPrim(localID);
482 if (prim != null)
483 {
484 prim.UpdateGroupMouseRotation( pos, rot);
485 break;
486 }
487 }
488 }
489 }
490
491 /// <summary>
492 ///
493 /// </summary>
494 /// <param name="localID"></param>
495 /// <param name="rot"></param>
496 /// <param name="remoteClient"></param>
497 public void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
498 {
499 Primitive prim = null;
500 foreach (EntityBase ent in Entities.Values)
501 {
502 if (ent is SceneObject)
503 {
504 prim = ((SceneObject)ent).HasChildPrim(localID);
505 if (prim != null)
506 {
507 prim.UpdateGroupRotation(rot);
508 break;
509 }
510 }
511 }
512 }
513
514 /// <summary>
515 ///
516 /// </summary>
517 /// <param name="localID"></param>
518 /// <param name="rot"></param>
519 /// <param name="remoteClient"></param>
520 public void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
521 {
522 //Console.WriteLine("trying to update single prim rotation");
523 Primitive prim = null;
524 foreach (EntityBase ent in Entities.Values)
525 {
526 if (ent is SceneObject)
527 {
528 prim = ((SceneObject)ent).HasChildPrim(localID);
529 if (prim != null)
530 {
531 prim.UpdateSingleRotation(rot);
532 break;
533 }
534 }
535 }
536 }
537
538 /// <summary>
539 ///
540 /// </summary>
541 /// <param name="localID"></param>
542 /// <param name="scale"></param>
543 /// <param name="remoteClient"></param>
544 public void UpdatePrimScale(uint localID, LLVector3 scale, IClientAPI remoteClient)
545 {
546 Primitive prim = null;
547 foreach (EntityBase ent in Entities.Values)
548 {
549 if (ent is SceneObject)
550 {
551 prim = ((SceneObject)ent).HasChildPrim(localID);
552 if (prim != null)
553 {
554 prim.ResizeGoup(scale);
555 break;
556 }
557 }
558 }
559 }
560
561 /// <summary>
562 /// Sends prims to a client
563 /// </summary>
564 /// <param name="RemoteClient">Client to send to</param>
565 public void GetInitialPrims(IClientAPI RemoteClient)
566 {
567
568 }
569 }
570}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
new file mode 100644
index 0000000..d1f6038
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -0,0 +1,806 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Threading;
31using System.Timers;
32using libsecondlife;
33using libsecondlife.Packets;
34using OpenSim.Framework;
35using OpenSim.Framework.Communications;
36using OpenSim.Framework.Console;
37using OpenSim.Framework.Interfaces;
38using OpenSim.Framework.Servers;
39using OpenSim.Framework.Types;
40using OpenSim.Physics.Manager;
41using OpenSim.Region.Caches;
42using OpenSim.Region.Environment.Scripting;
43using OpenSim.Region.Terrain;
44using Caps=OpenSim.Region.Capabilities.Caps;
45using Timer=System.Timers.Timer;
46
47namespace OpenSim.Region.Environment.Scenes
48{
49 public delegate bool FilterAvatarList(ScenePresence avatar);
50
51 public partial class Scene : SceneBase, ILocalStorageReceiver
52 {
53 protected Timer m_heartbeatTimer = new Timer();
54 protected Dictionary<LLUUID, ScenePresence> Avatars;
55 protected Dictionary<LLUUID, SceneObject> Prims;
56 private PhysicsScene phyScene;
57 private float timeStep = 0.1f;
58 private Random Rand = new Random();
59 private uint _primCount = 702000;
60 private System.Threading.Mutex _primAllocateMutex = new Mutex(false);
61 private int storageCount;
62 private Mutex updateLock;
63
64 protected AuthenticateSessionsBase authenticateHandler;
65 protected RegionCommsListener regionCommsHost;
66 protected CommunicationsManager commsManager;
67
68 protected Dictionary<LLUUID, Caps> capsHandlers = new Dictionary<LLUUID, Caps>();
69 protected BaseHttpServer httpListener;
70
71 public ParcelManager parcelManager;
72 public EstateManager estateManager;
73 public EventManager eventManager;
74 public ScriptManager scriptManager;
75
76 #region Properties
77 /// <summary>
78 ///
79 /// </summary>
80 public PhysicsScene PhysScene
81 {
82 set
83 {
84 this.phyScene = value;
85 }
86 get
87 {
88 return (this.phyScene);
89 }
90 }
91
92 #endregion
93
94 #region Constructors
95 /// <summary>
96 /// Creates a new World class, and a region to go with it.
97 /// </summary>
98 /// <param name="clientThreads">Dictionary to contain client threads</param>
99 /// <param name="regionHandle">Region Handle for this region</param>
100 /// <param name="regionName">Region Name for this region</param>
101 public Scene(ClientManager clientManager, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer)
102 {
103 updateLock = new Mutex(false);
104 this.authenticateHandler = authen;
105 this.commsManager = commsMan;
106 this.assetCache = assetCach;
107 m_clientManager = clientManager;
108 m_regInfo = regInfo;
109 m_regionHandle = m_regInfo.RegionHandle;
110 m_regionName = m_regInfo.RegionName;
111 this.m_datastore = m_regInfo.DataStore;
112 this.RegisterRegionWithComms();
113
114 parcelManager = new ParcelManager(this, this.m_regInfo);
115 estateManager = new EstateManager(this, this.m_regInfo);
116 scriptManager = new ScriptManager(this);
117 eventManager = new EventManager();
118
119 MainLog.Instance.Verbose("World.cs - creating new entitities instance");
120 Entities = new Dictionary<LLUUID, EntityBase>();
121 Avatars = new Dictionary<LLUUID, ScenePresence>();
122 Prims = new Dictionary<LLUUID, SceneObject>();
123
124 MainLog.Instance.Verbose("World.cs - creating LandMap");
125 Terrain = new TerrainEngine();
126
127 ScenePresence.LoadAnims();
128 this.httpListener = httpServer;
129 }
130 #endregion
131
132 /// <summary>
133 ///
134 /// </summary>
135 public void StartTimer()
136 {
137 m_heartbeatTimer.Enabled = true;
138 m_heartbeatTimer.Interval = 100;
139 m_heartbeatTimer.Elapsed += new ElapsedEventHandler(this.Heartbeat);
140 }
141
142
143 #region Update Methods
144
145
146 /// <summary>
147 /// Performs per-frame updates regularly
148 /// </summary>
149 /// <param name="sender"></param>
150 /// <param name="e"></param>
151 void Heartbeat(object sender, EventArgs e)
152 {
153 this.Update();
154 }
155
156 /// <summary>
157 /// Performs per-frame updates on the world, this should be the central world loop
158 /// </summary>
159 public override void Update()
160 {
161 updateLock.WaitOne();
162 try
163 {
164 if (this.phyScene.IsThreaded)
165 {
166 this.phyScene.GetResults();
167
168 }
169
170 foreach (LLUUID UUID in Entities.Keys)
171 {
172 Entities[UUID].updateMovement();
173 }
174
175 lock (this.m_syncRoot)
176 {
177 this.phyScene.Simulate(timeStep);
178 }
179
180 foreach (LLUUID UUID in Entities.Keys)
181 {
182 Entities[UUID].update();
183 }
184
185 // General purpose event manager
186 eventManager.TriggerOnFrame();
187
188 //backup world data
189 this.storageCount++;
190 if (storageCount > 1200) //set to how often you want to backup
191 {
192 this.Backup();
193 storageCount = 0;
194 }
195 }
196 catch (Exception e)
197 {
198 MainLog.Instance.Warn("World.cs: Update() - Failed with exception " + e.ToString());
199 }
200 updateLock.ReleaseMutex();
201
202 }
203
204 /// <summary>
205 ///
206 /// </summary>
207 /// <returns></returns>
208 public bool Backup()
209 {
210
211 return true;
212 }
213 #endregion
214
215 #region Regenerate Terrain
216
217 /// <summary>
218 /// Rebuilds the terrain using a procedural algorithm
219 /// </summary>
220 public void RegenerateTerrain()
221 {
222 try
223 {
224 Terrain.hills();
225
226 lock (this.m_syncRoot)
227 {
228 this.phyScene.SetTerrain(Terrain.getHeights1D());
229 }
230 this.localStorage.SaveMap(this.Terrain.getHeights1D());
231
232 m_clientManager.ForEachClient(delegate(IClientAPI client)
233 {
234 this.SendLayerData(client);
235 });
236
237 foreach (LLUUID UUID in Entities.Keys)
238 {
239 Entities[UUID].LandRenegerated();
240 }
241 }
242 catch (Exception e)
243 {
244 MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
245 }
246 }
247
248 /// <summary>
249 /// Rebuilds the terrain using a 2D float array
250 /// </summary>
251 /// <param name="newMap">256,256 float array containing heights</param>
252 public void RegenerateTerrain(float[,] newMap)
253 {
254 try
255 {
256 this.Terrain.setHeights2D(newMap);
257 lock (this.m_syncRoot)
258 {
259 this.phyScene.SetTerrain(this.Terrain.getHeights1D());
260 }
261 this.localStorage.SaveMap(this.Terrain.getHeights1D());
262
263 m_clientManager.ForEachClient(delegate(IClientAPI client)
264 {
265 this.SendLayerData(client);
266 });
267
268 foreach (LLUUID UUID in Entities.Keys)
269 {
270 Entities[UUID].LandRenegerated();
271 }
272 }
273 catch (Exception e)
274 {
275 MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
276 }
277 }
278
279 /// <summary>
280 /// Rebuilds the terrain assuming changes occured at a specified point[?]
281 /// </summary>
282 /// <param name="changes">???</param>
283 /// <param name="pointx">???</param>
284 /// <param name="pointy">???</param>
285 public void RegenerateTerrain(bool changes, int pointx, int pointy)
286 {
287 try
288 {
289 if (changes)
290 {
291 /* Dont save here, rely on tainting system instead */
292
293 m_clientManager.ForEachClient(delegate(IClientAPI client)
294 {
295 this.SendLayerData(pointx, pointy, client);
296 });
297 }
298 }
299 catch (Exception e)
300 {
301 MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
302 }
303 }
304
305 #endregion
306
307 #region Load Terrain
308 /// <summary>
309 /// Loads the World heightmap
310 /// </summary>
311 ///
312 public override void LoadWorldMap()
313 {
314 try
315 {
316 float[] map = this.localStorage.LoadWorld();
317 if (map == null)
318 {
319 if (string.IsNullOrEmpty(this.m_regInfo.estateSettings.terrainFile))
320 {
321 Console.WriteLine("No default terrain, procedurally generating...");
322 this.Terrain.hills();
323
324 this.localStorage.SaveMap(this.Terrain.getHeights1D());
325 }
326 else
327 {
328 try
329 {
330 this.Terrain.loadFromFileF32(this.m_regInfo.estateSettings.terrainFile);
331 this.Terrain *= this.m_regInfo.estateSettings.terrainMultiplier;
332 }
333 catch
334 {
335 Console.WriteLine("Unable to load default terrain, procedurally generating instead...");
336 Terrain.hills();
337 }
338 this.localStorage.SaveMap(this.Terrain.getHeights1D());
339 }
340 }
341 else
342 {
343 this.Terrain.setHeights1D(map);
344 }
345
346 CreateTerrainTexture();
347
348 }
349 catch (Exception e)
350 {
351 MainLog.Instance.Warn("World.cs: LoadWorldMap() - Failed with exception " + e.ToString());
352 }
353 }
354
355 /// <summary>
356 ///
357 /// </summary>
358 private void CreateTerrainTexture()
359 {
360 //create a texture asset of the terrain
361 byte[] data = this.Terrain.exportJpegImage("defaultstripe.png");
362 this.m_regInfo.estateSettings.terrainImageID = LLUUID.Random();
363 AssetBase asset = new AssetBase();
364 asset.FullID = this.m_regInfo.estateSettings.terrainImageID;
365 asset.Data = data;
366 asset.Name = "terrainImage";
367 asset.Type = 0;
368 this.assetCache.AddAsset(asset);
369 }
370 #endregion
371
372 #region Primitives Methods
373
374
375 /// <summary>
376 /// Loads the World's objects
377 /// </summary>
378 public void LoadPrimsFromStorage()
379 {
380 try
381 {
382 MainLog.Instance.Verbose("World.cs: LoadPrimsFromStorage() - Loading primitives");
383 this.localStorage.LoadPrimitives(this);
384 }
385 catch (Exception e)
386 {
387 MainLog.Instance.Warn("World.cs: LoadPrimsFromStorage() - Failed with exception " + e.ToString());
388 }
389 }
390
391 /// <summary>
392 /// Loads a specific object from storage
393 /// </summary>
394 /// <param name="prim">The object to load</param>
395 public void PrimFromStorage(PrimData prim)
396 {
397
398 }
399
400 /// <summary>
401 /// Returns a new unallocated primitive ID
402 /// </summary>
403 /// <returns>A brand new primitive ID</returns>
404 public uint PrimIDAllocate()
405 {
406 uint myID;
407
408 _primAllocateMutex.WaitOne();
409 ++_primCount;
410 myID = _primCount;
411 _primAllocateMutex.ReleaseMutex();
412
413 return myID;
414 }
415
416 /// <summary>
417 ///
418 /// </summary>
419 /// <param name="addPacket"></param>
420 /// <param name="agentClient"></param>
421 public void AddNewPrim(Packet addPacket, IClientAPI agentClient)
422 {
423 AddNewPrim((ObjectAddPacket)addPacket, agentClient.AgentId);
424 }
425
426 /// <summary>
427 ///
428 /// </summary>
429 /// <param name="addPacket"></param>
430 /// <param name="ownerID"></param>
431 public void AddNewPrim(ObjectAddPacket addPacket, LLUUID ownerID)
432 {
433 try
434 {
435 SceneObject sceneOb = new SceneObject(m_regionHandle, this, addPacket, ownerID, this.PrimIDAllocate());
436 this.Entities.Add(sceneOb.rootUUID, sceneOb);
437
438 // Trigger event for listeners
439 // eventManager.TriggerOnNewPrimitive(prim);
440 }
441 catch (Exception e)
442 {
443 MainLog.Instance.Warn("World.cs: AddNewPrim() - Failed with exception " + e.ToString());
444 }
445 }
446
447 public override uint AddNewPrim(LLUUID ownerId, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID texture, int flags)
448 {
449 uint id = NextLocalId;
450
451 throw new NotImplementedException("Not implemented yet.");
452 }
453
454 #endregion
455
456 #region Add/Remove Avatar Methods
457
458 /// <summary>
459 ///
460 /// </summary>
461 /// <param name="remoteClient"></param
462 /// <param name="agentID"></param>
463 /// <param name="child"></param>
464 public override void AddNewClient(IClientAPI client, bool child)
465 {
466 client.OnRegionHandShakeReply += this.SendLayerData;
467 //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims);
468 client.OnChatFromViewer += this.SimChat;
469 client.OnInstantMessage += this.InstantMessage;
470 client.OnRequestWearables += this.InformClientOfNeighbours;
471 client.OnAddPrim += this.AddNewPrim;
472 client.OnUpdatePrimGroupPosition += this.UpdatePrimPosition;
473 client.OnUpdatePrimSinglePosition += this.UpdatePrimSinglePosition;
474 client.OnUpdatePrimGroupRotation += this.UpdatePrimRotation;
475 client.OnUpdatePrimGroupMouseRotation += this.UpdatePrimRotation;
476 client.OnUpdatePrimSingleRotation += this.UpdatePrimSingleRotation;
477 client.OnUpdatePrimScale += this.UpdatePrimScale;
478 client.OnUpdatePrimShape += this.UpdatePrimShape;
479 client.OnRequestMapBlocks += this.RequestMapBlocks;
480 client.OnTeleportLocationRequest += this.RequestTeleportLocation;
481 client.OnObjectSelect += this.SelectPrim;
482 client.OnGrapUpdate += this.MoveObject;
483 client.OnNameFromUUIDRequest += this.commsManager.HandleUUIDNameRequest;
484 client.OnObjectDescription += this.PrimDescription;
485 client.OnObjectName += this.PrimName;
486 client.OnLinkObjects += this.LinkObjects;
487 client.OnObjectDuplicate += this.DuplicateObject;
488
489 /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
490 remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest);
491 remoteClient.OnParcelJoinRequest += new ParcelJoinRequest(parcelManager.handleParcelJoinRequest);
492 remoteClient.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(parcelManager.handleParcelPropertiesUpdateRequest);
493 remoteClient.OnEstateOwnerMessage += new EstateOwnerMessageRequest(estateManager.handleEstateOwnerMessage);
494 */
495 this.estateManager.sendRegionHandshake(client);
496
497 CreateAndAddScenePresence(client);
498 return;
499 }
500
501 protected void CreateAndAddScenePresence(IClientAPI client)
502 {
503 ScenePresence newAvatar = null;
504
505 MainLog.Instance.Verbose("World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent");
506 newAvatar = new ScenePresence(client, this, this.m_regInfo);
507 MainLog.Instance.Verbose("World.cs:AddViewerAgent() - Adding new avatar to world");
508 MainLog.Instance.Verbose("World.cs:AddViewerAgent() - Starting RegionHandshake ");
509
510 PhysicsVector pVec = new PhysicsVector(newAvatar.Pos.X, newAvatar.Pos.Y, newAvatar.Pos.Z);
511 lock (this.m_syncRoot)
512 {
513 newAvatar.PhysActor = this.phyScene.AddAvatar(pVec);
514 }
515
516 lock (Entities)
517 {
518 if (!Entities.ContainsKey(client.AgentId))
519 {
520 this.Entities.Add(client.AgentId, newAvatar);
521 }
522 else
523 {
524 Entities[client.AgentId] = newAvatar;
525 }
526 }
527 lock (Avatars)
528 {
529 if (Avatars.ContainsKey(client.AgentId))
530 {
531 Avatars[client.AgentId] = newAvatar;
532 }
533 else
534 {
535 this.Avatars.Add(client.AgentId, newAvatar);
536 }
537 }
538 }
539
540
541 /// <summary>
542 ///
543 /// </summary>
544 /// <param name="agentID"></param>
545 public override void RemoveClient(LLUUID agentID)
546 {
547 eventManager.TriggerOnRemovePresence(agentID);
548
549 ScenePresence avatar = this.RequestAvatar(agentID);
550
551 m_clientManager.ForEachClient(
552 delegate(IClientAPI client)
553 {
554 client.SendKillObject(avatar.RegionHandle, avatar.LocalId);
555 });
556
557 lock (Avatars) {
558 if (Avatars.ContainsKey(agentID)) {
559 Avatars.Remove(agentID);
560 }
561 }
562 lock (Entities) {
563 if (Entities.ContainsKey(agentID)) {
564 Entities.Remove(agentID);
565 }
566 }
567 // TODO: Add the removal from physics ?
568
569
570
571 return;
572 }
573 #endregion
574
575 #region Request Avatars List Methods
576 //The idea is to have a group of method that return a list of avatars meeting some requirement
577 // ie it could be all Avatars within a certain range of the calling prim/avatar.
578
579 /// <summary>
580 /// Request a List of all Avatars in this World
581 /// </summary>
582 /// <returns></returns>
583 public List<ScenePresence> RequestAvatarList()
584 {
585 List<ScenePresence> result = new List<ScenePresence>();
586
587 foreach (ScenePresence avatar in Avatars.Values)
588 {
589 result.Add(avatar);
590 }
591
592 return result;
593 }
594
595 /// <summary>
596 /// Request a filtered list of Avatars in this World
597 /// </summary>
598 /// <returns></returns>
599 public List<ScenePresence> RequestAvatarList(FilterAvatarList filter)
600 {
601 List<ScenePresence> result = new List<ScenePresence>();
602
603 foreach (ScenePresence avatar in Avatars.Values)
604 {
605 if (filter(avatar))
606 {
607 result.Add(avatar);
608 }
609 }
610
611 return result;
612 }
613
614 /// <summary>
615 /// Request a Avatar by UUID
616 /// </summary>
617 /// <param name="avatarID"></param>
618 /// <returns></returns>
619 public ScenePresence RequestAvatar(LLUUID avatarID)
620 {
621 if (this.Avatars.ContainsKey(avatarID))
622 {
623 return Avatars[avatarID];
624 }
625 return null;
626 }
627 #endregion
628
629
630 /// <summary>
631 ///
632 /// </summary>
633 /// <param name="entID"></param>
634 /// <returns></returns>
635 public bool DeleteEntity(LLUUID entID)
636 {
637 if (this.Entities.ContainsKey(entID))
638 {
639 this.Entities.Remove(entID);
640 return true;
641 }
642 return false;
643 }
644
645 public void SendAllSceneObjectsToClient(IClientAPI client)
646 {
647 foreach (EntityBase ent in Entities.Values)
648 {
649 if (ent is SceneObject)
650 {
651 ((SceneObject)ent).SendAllChildPrimsToClient(client);
652 }
653 }
654 }
655
656 #region RegionCommsHost
657
658 /// <summary>
659 ///
660 /// </summary>
661 public void RegisterRegionWithComms()
662 {
663
664 this.regionCommsHost = this.commsManager.GridServer.RegisterRegion(this.m_regInfo);
665 if (this.regionCommsHost != null)
666 {
667 this.regionCommsHost.OnExpectUser += this.NewUserConnection;
668 this.regionCommsHost.OnAvatarCrossingIntoRegion += this.AgentCrossing;
669 }
670 }
671
672 /// <summary>
673 ///
674 /// </summary>
675 /// <param name="regionHandle"></param>
676 /// <param name="agent"></param>
677 public void NewUserConnection(ulong regionHandle, AgentCircuitData agent)
678 {
679 // Console.WriteLine("World.cs - add new user connection");
680 //should just check that its meant for this region
681 if (regionHandle == this.m_regInfo.RegionHandle)
682 {
683 if (agent.CapsPath != "")
684 {
685 //Console.WriteLine("new user, so creating caps handler for it");
686 Caps cap = new Caps(this.assetCache, httpListener, this.m_regInfo.ExternalHostName, this.m_regInfo.ExternalEndPoint.Port, agent.CapsPath, agent.AgentID);
687 cap.RegisterHandlers();
688 this.capsHandlers.Add(agent.AgentID, cap);
689 }
690 this.authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
691 }
692 }
693
694 public void AgentCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position)
695 {
696 if (regionHandle == this.m_regInfo.RegionHandle)
697 {
698 if (this.Avatars.ContainsKey(agentID))
699 {
700 this.Avatars[agentID].MakeAvatar(position);
701 }
702 }
703 }
704
705 /// <summary>
706 ///
707 /// </summary>
708 public void InformClientOfNeighbours(IClientAPI remoteClient)
709 {
710 List<RegionInfo> neighbours = this.commsManager.GridServer.RequestNeighbours(this.m_regInfo);
711
712 if (neighbours != null)
713 {
714 for (int i = 0; i < neighbours.Count; i++)
715 {
716 AgentCircuitData agent = remoteClient.RequestClientInfo();
717 agent.BaseFolder = LLUUID.Zero;
718 agent.InventoryFolder = LLUUID.Zero;
719 agent.startpos = new LLVector3(128, 128, 70);
720 agent.child = true;
721 this.commsManager.InterRegion.InformRegionOfChildAgent(neighbours[i].RegionHandle, agent);
722 remoteClient.InformClientOfNeighbour(neighbours[i].RegionHandle, neighbours[i].ExternalEndPoint);
723 //this.capsHandlers[remoteClient.AgentId].CreateEstablishAgentComms("", System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr) + ":" + neighbours[i].CommsIPListenPort);
724 }
725 }
726 }
727
728 /// <summary>
729 ///
730 /// </summary>
731 /// <param name="regionHandle"></param>
732 /// <returns></returns>
733 public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle)
734 {
735 return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle);
736 }
737
738 /// <summary>
739 ///
740 /// </summary>
741 /// <param name="minX"></param>
742 /// <param name="minY"></param>
743 /// <param name="maxX"></param>
744 /// <param name="maxY"></param>
745 public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY)
746 {
747 List<MapBlockData> mapBlocks;
748 mapBlocks = this.commsManager.GridServer.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
749 remoteClient.SendMapBlock(mapBlocks);
750 }
751
752 /// <summary>
753 ///
754 /// </summary>
755 /// <param name="remoteClient"></param>
756 /// <param name="RegionHandle"></param>
757 /// <param name="position"></param>
758 /// <param name="lookAt"></param>
759 /// <param name="flags"></param>
760 public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags)
761 {
762 if (regionHandle == this.m_regionHandle)
763 {
764 if (this.Avatars.ContainsKey(remoteClient.AgentId))
765 {
766 remoteClient.SendTeleportLocationStart();
767 remoteClient.SendLocalTeleport(position, lookAt, flags);
768 this.Avatars[remoteClient.AgentId].Teleport(position);
769 }
770 }
771 else
772 {
773 RegionInfo reg = this.RequestNeighbouringRegionInfo(regionHandle);
774 if (reg != null)
775 {
776 remoteClient.SendTeleportLocationStart();
777 AgentCircuitData agent = remoteClient.RequestClientInfo();
778 agent.BaseFolder = LLUUID.Zero;
779 agent.InventoryFolder = LLUUID.Zero;
780 agent.startpos = new LLVector3(128, 128, 70);
781 agent.child = true;
782 this.commsManager.InterRegion.InformRegionOfChildAgent(regionHandle, agent);
783 this.commsManager.InterRegion.ExpectAvatarCrossing(regionHandle, remoteClient.AgentId, position);
784
785 remoteClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4));
786
787 }
788 //remoteClient.SendTeleportCancel();
789 }
790 }
791
792 /// <summary>
793 ///
794 /// </summary>
795 /// <param name="regionhandle"></param>
796 /// <param name="agentID"></param>
797 /// <param name="position"></param>
798 public bool InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position)
799 {
800 return this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position);
801 }
802
803 #endregion
804
805 }
806}
diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs
new file mode 100644
index 0000000..811f54c
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs
@@ -0,0 +1,198 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using libsecondlife;
32using OpenSim.Framework.Console;
33using OpenSim.Framework.Interfaces;
34using OpenSim.Framework.Types;
35using OpenSim.Region.Caches;
36using OpenSim.Region.Terrain;
37using OpenSim.Framework;
38
39namespace OpenSim.Region.Environment.Scenes
40{
41 public abstract class SceneBase : IWorld
42 {
43 public Dictionary<LLUUID, EntityBase> Entities;
44 protected ClientManager m_clientManager;
45 protected ulong m_regionHandle;
46 protected string m_regionName;
47 protected RegionInfo m_regInfo;
48
49 public TerrainEngine Terrain;
50
51 public string m_datastore;
52 public ILocalStorage localStorage;
53
54 protected object m_syncRoot = new object();
55 private uint m_nextLocalId = 8880000;
56 protected AssetCache assetCache;
57
58 #region Update Methods
59 /// <summary>
60 /// Normally called once every frame/tick to let the world preform anything required (like running the physics simulation)
61 /// </summary>
62 public abstract void Update();
63
64 #endregion
65
66 #region Terrain Methods
67
68 /// <summary>
69 /// Loads the World heightmap
70 /// </summary>
71 public abstract void LoadWorldMap();
72
73 /// <summary>
74 /// Loads a new storage subsystem from a named library
75 /// </summary>
76 /// <param name="dllName">Storage Library</param>
77 /// <returns>Successful or not</returns>
78 public bool LoadStorageDLL(string dllName)
79 {
80 try
81 {
82 Assembly pluginAssembly = Assembly.LoadFrom(dllName);
83 ILocalStorage store = null;
84
85 foreach (Type pluginType in pluginAssembly.GetTypes())
86 {
87 if (pluginType.IsPublic)
88 {
89 if (!pluginType.IsAbstract)
90 {
91 Type typeInterface = pluginType.GetInterface("ILocalStorage", true);
92
93 if (typeInterface != null)
94 {
95 ILocalStorage plug = (ILocalStorage)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
96 store = plug;
97
98 store.Initialise(this.m_datastore);
99 break;
100 }
101
102 typeInterface = null;
103 }
104 }
105 }
106 pluginAssembly = null;
107 this.localStorage = store;
108 return (store == null);
109 }
110 catch (Exception e)
111 {
112 MainLog.Instance.Warn("World.cs: LoadStorageDLL() - Failed with exception " + e.ToString());
113 return false;
114 }
115 }
116
117
118 /// <summary>
119 /// Send the region heightmap to the client
120 /// </summary>
121 /// <param name="RemoteClient">Client to send to</param>
122 public virtual void SendLayerData(IClientAPI RemoteClient)
123 {
124 RemoteClient.SendLayerData(Terrain.getHeights1D());
125 }
126
127 /// <summary>
128 /// Sends a specified patch to a client
129 /// </summary>
130 /// <param name="px">Patch coordinate (x) 0..16</param>
131 /// <param name="py">Patch coordinate (y) 0..16</param>
132 /// <param name="RemoteClient">The client to send to</param>
133 public virtual void SendLayerData(int px, int py, IClientAPI RemoteClient)
134 {
135 RemoteClient.SendLayerData(px, py, Terrain.getHeights1D());
136 }
137
138 #endregion
139
140 #region Add/Remove Agent/Avatar
141 /// <summary>
142 ///
143 /// </summary>
144 /// <param name="remoteClient"></param>
145 /// <param name="agentID"></param>
146 /// <param name="child"></param>
147 public abstract void AddNewClient(IClientAPI client, bool child);
148
149 public abstract uint AddNewPrim(LLUUID ownerId, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID texture, int flags);
150
151 /// <summary>
152 ///
153 /// </summary>
154 /// <param name="agentID"></param>
155 public abstract void RemoveClient(LLUUID agentID);
156
157 #endregion
158
159 /// <summary>
160 ///
161 /// </summary>
162 /// <returns></returns>
163 public virtual RegionInfo RegionInfo
164 {
165 get { return this.m_regInfo; }
166 }
167
168 public object SyncRoot
169 {
170 get { return m_syncRoot; }
171 }
172
173 public uint NextLocalId
174 {
175 get { return m_nextLocalId++; }
176 }
177
178 #region Shutdown
179 /// <summary>
180 /// Tidy before shutdown
181 /// </summary>
182 public virtual void Close()
183 {
184 try
185 {
186 this.localStorage.ShutDown();
187 }
188 catch (Exception e)
189 {
190 MainLog.Instance.WriteLine(LogPriority.HIGH, "World.cs: Close() - Failed with exception " + e.ToString());
191 }
192 }
193
194 #endregion
195
196
197 }
198}
diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
new file mode 100644
index 0000000..9e383c6
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
@@ -0,0 +1,50 @@
1using libsecondlife;
2
3namespace OpenSim.Region.Environment.Scenes
4{
5 /// <summary>
6 /// A class for triggering remote scene events.
7 /// </summary>
8 public class EventManager
9 {
10 public delegate void OnFrameDelegate();
11 public event OnFrameDelegate OnFrame;
12
13 public delegate void OnNewPresenceDelegate(ScenePresence presence);
14 public event OnNewPresenceDelegate OnNewPresence;
15
16 public delegate void OnNewPrimitiveDelegate(PrimitiveOld prim);
17 public event OnNewPrimitiveDelegate OnNewPrimitive;
18
19 public delegate void OnRemovePresenceDelegate(LLUUID uuid);
20 public event OnRemovePresenceDelegate OnRemovePresence;
21
22 public void TriggerOnFrame()
23 {
24 if (OnFrame != null)
25 {
26 OnFrame();
27 }
28 }
29
30 public void TriggerOnNewPrimitive(PrimitiveOld prim)
31 {
32 if (OnNewPrimitive != null)
33 OnNewPrimitive(prim);
34 }
35
36 public void TriggerOnNewPresence(ScenePresence presence)
37 {
38 if (OnNewPresence != null)
39 OnNewPresence(presence);
40 }
41
42 public void TriggerOnRemovePresence(LLUUID uuid)
43 {
44 if (OnRemovePresence != null)
45 {
46 OnRemovePresence(uuid);
47 }
48 }
49 }
50}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObject.cs b/OpenSim/Region/Environment/Scenes/SceneObject.cs
new file mode 100644
index 0000000..ecd2dee
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/SceneObject.cs
@@ -0,0 +1,246 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Collections.Generic;
29using System.Text;
30using libsecondlife;
31using libsecondlife.Packets;
32using OpenSim.Framework.Interfaces;
33using OpenSim.Physics.Manager;
34
35namespace OpenSim.Region.Environment.Scenes
36{
37 public class SceneObject : EntityBase
38 {
39 private Encoding enc = Encoding.ASCII;
40 private Dictionary<LLUUID, Primitive> ChildPrimitives = new Dictionary<LLUUID, Primitive>(); //list of all primitive id's that are part of this group
41 public Primitive rootPrimitive;
42 private new Scene m_world;
43 protected ulong m_regionHandle;
44
45 private bool physicsEnabled = false;
46 private PhysicsScene m_PhysScene;
47 private PhysicsActor m_PhysActor;
48
49 public LLUUID rootUUID
50 {
51 get
52 {
53 this.uuid = this.rootPrimitive.uuid;
54 return this.uuid;
55 }
56 }
57
58 public uint rootLocalID
59 {
60 get
61 {
62 this.m_localId = this.rootPrimitive.LocalId;
63 return this.LocalId;
64 }
65 }
66
67 /// <summary>
68 ///
69 /// </summary>
70 public SceneObject(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
71 {
72 m_regionHandle = regionHandle;
73 m_world = world;
74 this.Pos = addPacket.ObjectData.RayEnd;
75 this.CreateRootFromPacket(addPacket, ownerID, localID);
76 }
77
78 /// <summary>
79 ///
80 /// </summary>
81 /// <remarks>Need a null constructor for duplication</remarks>
82 public SceneObject()
83 {
84
85 }
86
87 /// <summary>
88 ///
89 /// </summary>
90 /// <param name="addPacket"></param>
91 /// <param name="agentID"></param>
92 /// <param name="localID"></param>
93 public void CreateRootFromPacket(ObjectAddPacket addPacket, LLUUID agentID, uint localID)
94 {
95 this.rootPrimitive = new Primitive( this.m_regionHandle, this.m_world, addPacket, agentID, localID, true, this, this);
96 this.children.Add(rootPrimitive);
97 this.ChildPrimitives.Add(this.rootUUID, this.rootPrimitive);
98 }
99
100 /// <summary>
101 ///
102 /// </summary>
103 /// <param name="data"></param>
104 public void CreateFromBytes(byte[] data)
105 {
106
107 }
108
109 /// <summary>
110 ///
111 /// </summary>
112 /// <returns>A complete copy of the object</returns>
113 public SceneObject Copy()
114 {
115 SceneObject dupe = new SceneObject();
116
117 Primitive newRoot = this.rootPrimitive.Copy((EntityBase)dupe, dupe);
118
119 foreach (EntityBase child in this.children)
120 {
121 EntityBase newChild = child.Copy();
122 dupe.children.Add(newChild);
123 }
124
125 return dupe;
126 }
127
128 /// <summary>
129 ///
130 /// </summary>
131 public void DeleteAllChildren()
132 {
133 this.children.Clear();
134 this.ChildPrimitives.Clear();
135 this.rootPrimitive = null;
136 }
137
138 /// <summary>
139 ///
140 /// </summary>
141 /// <param name="primObject"></param>
142 public void AddNewChildPrims(SceneObject primObject)
143 {
144 this.rootPrimitive.AddNewChildren(primObject);
145 }
146
147 public void AddChildToList(Primitive prim)
148 {
149 if (!this.ChildPrimitives.ContainsKey(prim.uuid))
150 {
151 this.ChildPrimitives.Add(prim.uuid, prim);
152 }
153 }
154 /// <summary>
155 ///
156 /// </summary>
157 /// <param name="primID"></param>
158 /// <returns></returns>
159 public Primitive HasChildPrim(LLUUID primID)
160 {
161 if (this.ChildPrimitives.ContainsKey(primID))
162 {
163 return this.ChildPrimitives[primID];
164 }
165
166 return null;
167 }
168
169 /// <summary>
170 ///
171 /// </summary>
172 /// <param name="localID"></param>
173 /// <returns></returns>
174 public Primitive HasChildPrim(uint localID)
175 {
176 Primitive returnPrim = null;
177 foreach (Primitive prim in this.ChildPrimitives.Values)
178 {
179 if (prim.LocalId == localID)
180 {
181 returnPrim = prim;
182 break;
183 }
184 }
185 return returnPrim;
186 }
187
188 public void SendAllChildPrimsToClient(IClientAPI client)
189 {
190 this.rootPrimitive.SendFullUpdateForAllChildren(client);
191 }
192
193 /// <summary>
194 ///
195 /// </summary>
196 public override void BackUp()
197 {
198
199 }
200
201 /// <summary>
202 ///
203 /// </summary>
204 /// <param name="offset"></param>
205 /// <param name="pos"></param>
206 /// <param name="remoteClient"></param>
207 public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
208 {
209 this.rootPrimitive.Pos = pos ;
210 this.rootPrimitive.SendTerseUpdateForAllChildren(remoteClient);
211 }
212
213 /// <summary>
214 ///
215 /// </summary>
216 /// <param name="client"></param>
217 public void GetProperites(IClientAPI client)
218 {
219 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
220 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
221 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
222 proper.ObjectData[0].ItemID = LLUUID.Zero;
223 proper.ObjectData[0].CreationDate = (ulong)this.rootPrimitive.CreationDate;
224 proper.ObjectData[0].CreatorID = this.rootPrimitive.CreatorID;
225 proper.ObjectData[0].FolderID = LLUUID.Zero;
226 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
227 proper.ObjectData[0].GroupID = LLUUID.Zero;
228 proper.ObjectData[0].InventorySerial = 0;
229 proper.ObjectData[0].LastOwnerID = this.rootPrimitive.LastOwnerID;
230 proper.ObjectData[0].ObjectID = this.rootUUID;
231 proper.ObjectData[0].OwnerID = this.rootPrimitive.OwnerID;
232 proper.ObjectData[0].TouchName = enc.GetBytes(this.rootPrimitive.TouchName + "\0");
233 proper.ObjectData[0].TextureID = new byte[0];
234 proper.ObjectData[0].SitName = enc.GetBytes(this.rootPrimitive.SitName +"\0") ;
235 proper.ObjectData[0].Name = enc.GetBytes(this.rootPrimitive.Name +"\0");
236 proper.ObjectData[0].Description = enc.GetBytes(this.rootPrimitive.Description +"\0");
237 proper.ObjectData[0].OwnerMask = this.rootPrimitive.OwnerMask;
238 proper.ObjectData[0].NextOwnerMask = this.rootPrimitive.NextOwnerMask;
239 proper.ObjectData[0].GroupMask = this.rootPrimitive.GroupMask;
240 proper.ObjectData[0].EveryoneMask = this.rootPrimitive.EveryoneMask;
241 proper.ObjectData[0].BaseMask = this.rootPrimitive.BaseMask;
242
243 client.OutPacket(proper);
244 }
245 }
246}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs
new file mode 100644
index 0000000..d1f75ed
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs
@@ -0,0 +1,74 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Collections.Generic;
29using System.Xml;
30using libsecondlife;
31
32namespace OpenSim.Region.Environment.Scenes
33{
34 partial class ScenePresence
35 {
36 public class AvatarAnimations
37 {
38
39 public Dictionary<string, LLUUID> AnimsLLUUID = new Dictionary<string, LLUUID>();
40 public Dictionary<LLUUID, string> AnimsNames = new Dictionary<LLUUID, string>();
41
42 public AvatarAnimations()
43 {
44 }
45
46 public void LoadAnims()
47 {
48 //OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs:LoadAnims() - Loading avatar animations");
49 XmlTextReader reader = new XmlTextReader("data/avataranimations.xml");
50
51 XmlDocument doc = new XmlDocument();
52 doc.Load(reader);
53 foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
54 {
55
56 if (nod.Attributes["name"] != null)
57 {
58 AnimsLLUUID.Add(nod.Attributes["name"].Value, nod.InnerText);
59 }
60
61 }
62
63 reader.Close();
64
65 // OpenSim.Framework.Console.MainLog.Instance.Verbose("Loaded " + AnimsLLUUID.Count.ToString() + " animation(s)");
66
67 foreach (KeyValuePair<string, LLUUID> kp in Animations.AnimsLLUUID)
68 {
69 AnimsNames.Add(kp.Value, kp.Key);
70 }
71 }
72 }
73 }
74}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs
new file mode 100644
index 0000000..dbb5d3f
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs
@@ -0,0 +1,85 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using libsecondlife;
29using libsecondlife.Packets;
30using OpenSim.Framework.Interfaces;
31
32namespace OpenSim.Region.Environment.Scenes
33{
34 partial class ScenePresence
35 {
36 public class Avatar : IScenePresenceBody
37 {
38 public Avatar()
39 {
40
41 }
42
43 public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
44 {
45 }
46
47 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
48 {
49 }
50
51 public void SendOurAppearance(IClientAPI OurClient)
52 {
53 }
54
55 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
56 {
57 }
58 }
59
60 public class ChildAgent : IScenePresenceBody //is a ghost
61 {
62 public ChildAgent()
63 {
64
65 }
66
67 public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
68 {
69 }
70
71 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
72 {
73 }
74
75 public void SendOurAppearance(IClientAPI OurClient)
76 {
77 }
78
79 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
80 {
81 }
82 }
83 }
84
85}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
new file mode 100644
index 0000000..e65ab7c
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -0,0 +1,597 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.IO;
31using Axiom.Math;
32using libsecondlife;
33using libsecondlife.Packets;
34using OpenSim.Framework.Console;
35using OpenSim.Framework.Interfaces;
36using OpenSim.Framework.Types;
37using OpenSim.Physics.Manager;
38
39namespace OpenSim.Region.Environment.Scenes
40{
41 public partial class ScenePresence : Entity
42 {
43 public static bool PhysicsEngineFlying = false;
44 public static AvatarAnimations Animations;
45 public static byte[] DefaultTexture;
46 public string firstname;
47 public string lastname;
48 public IClientAPI ControllingClient;
49 public LLUUID current_anim;
50 public int anim_seq;
51 private bool updateflag = false;
52 private byte movementflag = 0;
53 private List<NewForce> forcesList = new List<NewForce>();
54 private short _updateCount = 0;
55 private Quaternion bodyRot;
56 private LLObject.TextureEntry avatarAppearanceTexture = null;
57 private byte[] visualParams;
58 private AvatarWearable[] Wearables;
59 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
60 private ulong m_regionHandle;
61 private bool childAgent = false;
62 private bool newForce = false;
63 private bool newAvatar = false;
64 private IScenePresenceBody m_body;
65
66 protected RegionInfo m_regionInfo;
67
68 private Vector3[] Dir_Vectors = new Vector3[6];
69 private enum Dir_ControlFlags
70 {
71 DIR_CONTROL_FLAG_FOWARD = MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS,
72 DIR_CONTROL_FLAG_BACK = MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG,
73 DIR_CONTROL_FLAG_LEFT = MainAvatar.ControlFlags.AGENT_CONTROL_LEFT_POS,
74 DIR_CONTROL_FLAG_RIGHT = MainAvatar.ControlFlags.AGENT_CONTROL_LEFT_NEG,
75 DIR_CONTROL_FLAG_UP = MainAvatar.ControlFlags.AGENT_CONTROL_UP_POS,
76 DIR_CONTROL_FLAG_DOWN = MainAvatar.ControlFlags.AGENT_CONTROL_UP_NEG
77 }
78
79 #region Properties
80 /// <summary>
81 ///
82 /// </summary>
83 public PhysicsActor PhysActor
84 {
85 set
86 {
87 this._physActor = value;
88 }
89 get
90 {
91 return _physActor;
92 }
93 }
94
95 public ulong RegionHandle
96 {
97 get { return m_regionHandle; }
98 }
99
100 #endregion
101
102 #region Constructor(s)
103 /// <summary>
104 ///
105 /// </summary>
106 /// <param name="theClient"></param>
107 /// <param name="world"></param>
108 /// <param name="clientThreads"></param>
109 /// <param name="regionDat"></param>
110 public ScenePresence(IClientAPI theClient, Scene world, RegionInfo reginfo)
111 {
112
113 m_world = world;
114 this.uuid = theClient.AgentId;
115
116 m_regionInfo = reginfo;
117 m_regionHandle = reginfo.RegionHandle;
118 MainLog.Instance.Verbose("Avatar.cs ");
119 ControllingClient = theClient;
120 this.firstname = ControllingClient.FirstName;
121 this.lastname = ControllingClient.LastName;
122 m_localId = m_world.NextLocalId;
123 Pos = ControllingClient.StartPos;
124 visualParams = new byte[218];
125 for (int i = 0; i < 218; i++)
126 {
127 visualParams[i] = 100;
128 }
129
130 Wearables = AvatarWearable.DefaultWearables;
131 Animations = new ScenePresence.AvatarAnimations();
132 Animations.LoadAnims();
133
134 this.avatarAppearanceTexture = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
135
136 //register for events
137 ControllingClient.OnRequestWearables += this.SendOurAppearance;
138 //ControllingClient.OnSetAppearance += new SetAppearance(this.SetAppearance);
139 ControllingClient.OnCompleteMovementToRegion += this.CompleteMovement;
140 ControllingClient.OnCompleteMovementToRegion += this.SendInitialData;
141 ControllingClient.OnAgentUpdate += this.HandleAgentUpdate;
142 // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack);
143 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
144 //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
145
146 Dir_Vectors[0] = new Vector3(1, 0, 0); //FOWARD
147 Dir_Vectors[1] = new Vector3(-1, 0, 0); //BACK
148 Dir_Vectors[2] = new Vector3(0, 1, 0); //LEFT
149 Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT
150 Dir_Vectors[4] = new Vector3(0, 0, 1); //UP
151 Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN
152
153 }
154 #endregion
155
156 #region Status Methods
157 /// <summary>
158 /// Not Used, most likely can be deleted
159 /// </summary>
160 /// <param name="status"></param>
161 public void ChildStatusChange(bool status)
162 {
163 this.childAgent = status;
164
165 if (this.childAgent == true)
166 {
167 this.Velocity = new LLVector3(0, 0, 0);
168 this.Pos = new LLVector3(128, 128, 70);
169
170 }
171 }
172
173 /// <summary>
174 ///
175 /// </summary>
176 /// <param name="pos"></param>
177 public void MakeAvatar(LLVector3 pos)
178 {
179 //this.childAvatar = false;
180 this.Pos = pos;
181 this.newAvatar = true;
182 this.childAgent = false;
183 }
184
185 protected void MakeChildAgent()
186 {
187 this.Velocity = new LLVector3(0, 0, 0);
188 this.Pos = new LLVector3(128, 128, 70);
189 this.childAgent = true;
190 }
191
192 /// <summary>
193 ///
194 /// </summary>
195 /// <param name="pos"></param>
196 public void Teleport(LLVector3 pos)
197 {
198 this.Pos = pos;
199 this.SendTerseUpdateToALLClients();
200 }
201
202 /// <summary>
203 ///
204 /// </summary>
205 public void StopMovement()
206 {
207
208 }
209 #endregion
210
211 #region Event Handlers
212 /// <summary>
213 ///
214 /// </summary>
215 /// <param name="texture"></param>
216 /// <param name="visualParam"></param>
217 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
218 {
219
220 }
221
222 /// <summary>
223 /// Complete Avatar's movement into the region
224 /// </summary>
225 public void CompleteMovement()
226 {
227 LLVector3 look = this.Velocity;
228 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
229 {
230 look = new LLVector3(0.99f, 0.042f, 0);
231 }
232 this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look);
233 if (this.childAgent)
234 {
235 this.childAgent = false;
236 }
237 }
238
239 /// <summary>
240 ///
241 /// </summary>
242 /// <param name="pack"></param>
243 public void HandleAgentUpdate(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
244 {
245 int i = 0;
246 bool update_movementflag = false;
247 bool update_rotation = false;
248 bool DCFlagKeyPressed = false;
249 Vector3 agent_control_v3 = new Vector3(0, 0, 0);
250 Quaternion q = new Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
251
252 this.PhysActor.Flying = ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0);
253
254 if (q != this.bodyRot)
255 {
256 this.bodyRot = q;
257 update_rotation = true;
258 }
259 foreach (Dir_ControlFlags DCF in Enum.GetValues(typeof(Dir_ControlFlags)))
260 {
261 if ((flags & (uint)DCF) != 0)
262 {
263 DCFlagKeyPressed = true;
264 agent_control_v3 += Dir_Vectors[i];
265 if ((movementflag & (uint)DCF) == 0)
266 {
267 movementflag += (byte)(uint)DCF;
268 update_movementflag = true;
269 }
270 }
271 else
272 {
273 if ((movementflag & (uint)DCF) != 0)
274 {
275 movementflag -= (byte)(uint)DCF;
276 update_movementflag = true;
277 }
278 }
279 i++;
280 }
281 if ((update_movementflag) || (update_rotation && DCFlagKeyPressed))
282 {
283 this.AddNewMovement(agent_control_v3, q);
284 }
285 UpdateMovementAnimations(update_movementflag);
286 }
287
288 protected void UpdateMovementAnimations(bool update_movementflag)
289 {
290 if (update_movementflag)
291 {
292 if (movementflag != 0)
293 {
294 if (this._physActor.Flying)
295 {
296 this.SendAnimPack(Animations.AnimsLLUUID["FLY"], 1);
297 }
298 else
299 {
300 this.SendAnimPack(Animations.AnimsLLUUID["WALK"], 1);
301 }
302 }
303 else
304 {
305 this.SendAnimPack(Animations.AnimsLLUUID["STAND"], 1);
306 }
307 }
308
309 }
310
311
312 protected void AddNewMovement(Vector3 vec, Quaternion rotation)
313 {
314 NewForce newVelocity = new NewForce();
315 Vector3 direc = rotation * vec;
316 direc.Normalize();
317
318 direc = direc * ((0.03f) * 128f);
319 if (this._physActor.Flying)
320 direc *= 4;
321
322 newVelocity.X = direc.x;
323 newVelocity.Y = direc.y;
324 newVelocity.Z = direc.z;
325 this.forcesList.Add(newVelocity);
326 }
327
328 #endregion
329
330 #region Overridden Methods
331 /// <summary>
332 ///
333 /// </summary>
334 public override void LandRenegerated()
335 {
336
337 }
338
339 /// <summary>
340 ///
341 /// </summary>
342 public override void update()
343 {
344 if (this.childAgent == false)
345 {
346 if (this.newForce)
347 {
348 this.SendTerseUpdateToALLClients();
349 _updateCount = 0;
350 }
351 else if (movementflag != 0)
352 {
353 _updateCount++;
354 if (_updateCount > 3)
355 {
356 this.SendTerseUpdateToALLClients();
357 _updateCount = 0;
358 }
359 }
360
361 this.CheckForBorderCrossing();
362 }
363 }
364 #endregion
365
366 #region Update Client(s)
367 /// <summary>
368 ///
369 /// </summary>
370 /// <param name="RemoteClient"></param>
371 public void SendTerseUpdateToClient(IClientAPI RemoteClient)
372 {
373 LLVector3 pos = this.Pos;
374 LLVector3 vel = this.Velocity;
375 RemoteClient.SendAvatarTerseUpdate(this.m_regionHandle, 64096, this.LocalId, new LLVector3(pos.X, pos.Y, pos.Z), new LLVector3(vel.X, vel.Y, vel.Z));
376 }
377
378 /// <summary>
379 ///
380 /// </summary>
381 public void SendTerseUpdateToALLClients()
382 {
383 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
384 for (int i = 0; i < avatars.Count; i++)
385 {
386 this.SendTerseUpdateToClient(avatars[i].ControllingClient);
387 }
388 }
389
390 /// <summary>
391 ///
392 /// </summary>
393 /// <param name="remoteAvatar"></param>
394 public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
395 {
396 remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
397 }
398
399 public void SendFullUpdateToALLClients()
400 {
401 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
402 foreach (ScenePresence avatar in this.m_world.RequestAvatarList())
403 {
404 this.SendFullUpdateToOtherClient(avatar);
405 avatar.SendFullUpdateToOtherClient(this);
406 }
407 }
408
409 /// <summary>
410 ///
411 /// </summary>
412 public void SendInitialData()
413 {
414 this.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
415 if (this.newAvatar)
416 {
417 this.m_world.InformClientOfNeighbours(this.ControllingClient);
418 this.newAvatar = false;
419 }
420 }
421
422 /// <summary>
423 ///
424 /// </summary>
425 /// <param name="OurClient"></param>
426 public void SendOurAppearance(IClientAPI OurClient)
427 {
428 this.ControllingClient.SendWearables(this.Wearables);
429 this.SendFullUpdateToALLClients();
430 this.m_world.SendAllSceneObjectsToClient(this.ControllingClient);
431 }
432
433 /// <summary>
434 ///
435 /// </summary>
436 /// <param name="avatarInfo"></param>
437 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
438 {
439
440 }
441
442 /// <summary>
443 ///
444 /// </summary>
445 /// <param name="animID"></param>
446 /// <param name="seq"></param>
447 public void SendAnimPack(LLUUID animID, int seq)
448 {
449 this.current_anim = animID;
450 this.anim_seq = seq;
451 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
452 for (int i = 0; i < avatars.Count; i++)
453 {
454 avatars[i].ControllingClient.SendAnimation(animID, seq, this.ControllingClient.AgentId);
455 }
456 }
457
458 /// <summary>
459 ///
460 /// </summary>
461 public void SendAnimPack()
462 {
463 this.SendAnimPack(this.current_anim, this.anim_seq);
464 }
465 #endregion
466
467 #region Border Crossing Methods
468 /// <summary>
469 ///
470 /// </summary>
471 protected void CheckForBorderCrossing()
472 {
473 LLVector3 pos2 = this.Pos;
474 LLVector3 vel = this.Velocity;
475
476 float timeStep = 0.2f;
477 pos2.X = pos2.X + (vel.X * timeStep);
478 pos2.Y = pos2.Y + (vel.Y * timeStep);
479 pos2.Z = pos2.Z + (vel.Z * timeStep);
480
481 if ((pos2.X < 0) || (pos2.X > 256))
482 {
483 this.CrossToNewRegion();
484 }
485
486 if ((pos2.Y < 0) || (pos2.Y > 256))
487 {
488 this.CrossToNewRegion();
489 }
490 }
491
492 /// <summary>
493 ///
494 /// </summary>
495 protected void CrossToNewRegion()
496 {
497 LLVector3 pos = this.Pos;
498 LLVector3 newpos = new LLVector3(pos.X, pos.Y, pos.Z);
499 uint neighbourx = this.m_regionInfo.RegionLocX;
500 uint neighboury = this.m_regionInfo.RegionLocY;
501
502 if (pos.X < 2)
503 {
504 neighbourx -= 1;
505 newpos.X = 254;
506 }
507 if (pos.X > 253)
508 {
509 neighbourx += 1;
510 newpos.X = 1;
511 }
512 if (pos.Y < 2)
513 {
514 neighboury -= 1;
515 newpos.Y = 254;
516 }
517 if (pos.Y > 253)
518 {
519 neighboury += 1;
520 newpos.Y = 1;
521 }
522
523 LLVector3 vel = this.m_velocity;
524 ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * 256), (uint)(neighboury * 256));
525 RegionInfo neighbourRegion = this.m_world.RequestNeighbouringRegionInfo(neighbourHandle);
526 if (neighbourRegion != null)
527 {
528 bool res = this.m_world.InformNeighbourOfCrossing(neighbourHandle, this.ControllingClient.AgentId, newpos);
529 if (res)
530 {
531 this.MakeChildAgent();
532 this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.InternalEndPoint);
533 }
534 }
535 }
536 #endregion
537
538 /// <summary>
539 ///
540 /// </summary>
541 public static void LoadAnims()
542 {
543
544 }
545
546 /// <summary>
547 ///
548 /// </summary>
549 public override void updateMovement()
550 {
551 newForce = false;
552 lock (this.forcesList)
553 {
554 if (this.forcesList.Count > 0)
555 {
556 for (int i = 0; i < this.forcesList.Count; i++)
557 {
558 NewForce force = this.forcesList[i];
559
560 this.updateflag = true;
561 this.Velocity = new LLVector3(force.X, force.Y, force.Z);
562 this.newForce = true;
563 }
564 for (int i = 0; i < this.forcesList.Count; i++)
565 {
566 this.forcesList.RemoveAt(0);
567 }
568 }
569 }
570 }
571
572 public static void LoadTextureFile(string name)
573 {
574 FileInfo fInfo = new FileInfo(name);
575 long numBytes = fInfo.Length;
576 FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read);
577 BinaryReader br = new BinaryReader(fStream);
578 byte[] data1 = br.ReadBytes((int)numBytes);
579 br.Close();
580 fStream.Close();
581 DefaultTexture = data1;
582 }
583
584 public class NewForce
585 {
586 public float X;
587 public float Y;
588 public float Z;
589
590 public NewForce()
591 {
592
593 }
594 }
595 }
596
597}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs
new file mode 100644
index 0000000..9cb881a
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs
@@ -0,0 +1,102 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.CodeDom.Compiler;
30using System.Collections.Generic;
31using Microsoft.CSharp;
32using OpenSim.Framework.Console;
33
34namespace OpenSim.Region.Environment.Scripting
35{
36 public class CSharpScriptEngine : IScriptCompiler
37 {
38 public string FileExt()
39 {
40 return ".cs";
41 }
42
43 private Dictionary<string,IScript> LoadDotNetScript(CodeDomProvider compiler, string filename)
44 {
45 CompilerParameters compilerParams = new CompilerParameters();
46 CompilerResults compilerResults;
47 compilerParams.GenerateExecutable = false;
48 compilerParams.GenerateInMemory = true;
49 compilerParams.IncludeDebugInformation = false;
50 compilerParams.ReferencedAssemblies.Add("OpenSim.Region.dll");
51 compilerParams.ReferencedAssemblies.Add("OpenSim.Region.Enviroment.dll");
52 compilerParams.ReferencedAssemblies.Add("OpenSim.Framework.dll");
53 compilerParams.ReferencedAssemblies.Add("libsecondlife.dll");
54 compilerParams.ReferencedAssemblies.Add("System.dll");
55
56 compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename);
57
58 if (compilerResults.Errors.Count > 0)
59 {
60 MainLog.Instance.Error("Compile errors");
61 foreach (CompilerError error in compilerResults.Errors)
62 {
63 MainLog.Instance.Error(error.Line.ToString() + ": " + error.ErrorText.ToString());
64 }
65 }
66 else
67 {
68 Dictionary<string,IScript> scripts = new Dictionary<string,IScript>();
69
70 foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes())
71 {
72 Type testInterface = pluginType.GetInterface("IScript", true);
73
74 if (testInterface != null)
75 {
76 IScript script = (IScript)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString());
77
78 string scriptName = "C#/" + script.getName();
79 Console.WriteLine("Script: " + scriptName + " loaded.");
80
81 if (!scripts.ContainsKey(scriptName))
82 {
83 scripts.Add(scriptName, script);
84 }
85 else
86 {
87 scripts[scriptName] = script;
88 }
89 }
90 }
91 return scripts;
92 }
93 return null;
94 }
95
96 public Dictionary<string,IScript> compile(string filename)
97 {
98 CSharpCodeProvider csharpProvider = new CSharpCodeProvider();
99 return LoadDotNetScript(csharpProvider, filename);
100 }
101 }
102}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs
new file mode 100644
index 0000000..be1fe56
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs
@@ -0,0 +1,102 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.CodeDom.Compiler;
30using System.Collections.Generic;
31using Microsoft.JScript;
32using OpenSim.Framework.Console;
33
34namespace OpenSim.Region.Environment.Scripting
35{
36 public class JScriptEngine : IScriptCompiler
37 {
38 public string FileExt()
39 {
40 return ".js";
41 }
42
43 private Dictionary<string, IScript> LoadDotNetScript(CodeDomProvider compiler, string filename)
44 {
45 CompilerParameters compilerParams = new CompilerParameters();
46 CompilerResults compilerResults;
47 compilerParams.GenerateExecutable = false;
48 compilerParams.GenerateInMemory = true;
49 compilerParams.IncludeDebugInformation = false;
50 compilerParams.ReferencedAssemblies.Add("OpenSim.Region.dll");
51 compilerParams.ReferencedAssemblies.Add("OpenSim.Region.Enviroment.dll");
52 compilerParams.ReferencedAssemblies.Add("OpenSim.Framework.dll");
53 compilerParams.ReferencedAssemblies.Add("libsecondlife.dll");
54 compilerParams.ReferencedAssemblies.Add("System.dll");
55
56 compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename);
57
58 if (compilerResults.Errors.Count > 0)
59 {
60 MainLog.Instance.Error("Compile errors");
61 foreach (CompilerError error in compilerResults.Errors)
62 {
63 MainLog.Instance.Error(error.Line.ToString() + ": " + error.ErrorText.ToString());
64 }
65 }
66 else
67 {
68 Dictionary<string, IScript> scripts = new Dictionary<string, IScript>();
69
70 foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes())
71 {
72 Type testInterface = pluginType.GetInterface("IScript", true);
73
74 if (testInterface != null)
75 {
76 IScript script = (IScript)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString());
77
78 string scriptName = "JS.NET/" + script.getName();
79 Console.WriteLine("Script: " + scriptName + " loaded.");
80
81 if (!scripts.ContainsKey(scriptName))
82 {
83 scripts.Add(scriptName, script);
84 }
85 else
86 {
87 scripts[scriptName] = script;
88 }
89 }
90 }
91 return scripts;
92 }
93 return null;
94 }
95
96 public Dictionary<string, IScript> compile(string filename)
97 {
98 JScriptCodeProvider jscriptProvider = new JScriptCodeProvider();
99 return LoadDotNetScript(jscriptProvider, filename);
100 }
101 }
102}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs
new file mode 100644
index 0000000..1d93197
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs
@@ -0,0 +1,45 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using OpenSim.Scripting.EmbeddedJVM.Types;
32
33namespace OpenSim.Scripting.EmbeddedJVM
34{
35 public class ClassInstance : Object
36 {
37 public int size;
38 public Dictionary<string, BaseType> Fields = new Dictionary<string, BaseType>();
39
40 public ClassInstance()
41 {
42
43 }
44 }
45}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs
new file mode 100644
index 0000000..f4ab1a2
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs
@@ -0,0 +1,503 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.IO;
30using System.Collections.Generic;
31using System.Text;
32using OpenSim.Scripting.EmbeddedJVM.Types;
33
34namespace OpenSim.Scripting.EmbeddedJVM
35{
36 public class ClassRecord
37 {
38 private ushort _majorVersion;
39 private ushort _minorVersion;
40 private ushort _constantPoolCount;
41 private ushort _accessFlags;
42 private ushort _thisClass;
43 private ushort _supperClass;
44 private ushort _interfaceCount;
45 private ushort _fieldCount;
46 private ushort _methodCount;
47 //private ushort _attributeCount;
48 //private string _name;
49 public Dictionary<string, BaseType> StaticFields = new Dictionary<string, BaseType>();
50 public PoolClass mClass;
51
52 public List<PoolItem> _constantsPool = new List<PoolItem>();
53 private List<MethodInfo> _methodsList = new List<MethodInfo>();
54 private List<FieldInfo> _fieldList = new List<FieldInfo>();
55
56 public ClassRecord()
57 {
58
59 }
60
61 public ClassInstance CreateNewInstance()
62 {
63 return new ClassInstance();
64 }
65
66 public void LoadClassFromFile(string fileName)
67 {
68 Console.WriteLine("loading script " + fileName);
69 FileStream fs = File.OpenRead(fileName);
70 this.LoadClassFromBytes(ReadFully(fs));
71 fs.Close();
72 }
73
74 public void LoadClassFromBytes(byte[] data)
75 {
76 int i = 0;
77 i += 4;
78 _minorVersion = (ushort)((data[i++] << 8) + data[i++] );
79 _majorVersion = (ushort)((data[i++] << 8) + data[i++] );
80 _constantPoolCount = (ushort)((data[i++] << 8) + data[i++] );
81 // Console.WriteLine("there should be " + _constantPoolCount + " items in the pool");
82 for (int count = 0; count < _constantPoolCount -1 ; count++)
83 {
84 //read in the constant pool
85 byte pooltype = data[i++];
86 //Console.WriteLine("#" +count +": new constant type = " +pooltype);
87 //Console.WriteLine("start position is: " + i);
88 switch (pooltype)
89 {
90 case 1: //Utf8
91 ushort uLength = (ushort)((data[i++] << 8) + data[i++] );
92
93 // Console.WriteLine("new utf8 type, length is " + uLength);
94 PoolUtf8 utf8 = new PoolUtf8();
95 utf8.readValue(data, ref i, uLength);
96 this._constantsPool.Add(utf8);
97 break;
98 case 3: //Int
99 break;
100 case 7: //Class
101 PoolClass pClass = new PoolClass(this);
102 pClass.readValue(data, ref i);
103 this._constantsPool.Add(pClass);
104 break;
105 case 10: //Method
106 PoolMethodRef pMeth = new PoolMethodRef(this);
107 pMeth.readValue(data, ref i);
108 this._constantsPool.Add(pMeth);
109 break;
110 case 12: //NamedType
111 PoolNamedType pNamed = new PoolNamedType(this);
112 pNamed.readValue(data, ref i);
113 this._constantsPool.Add(pNamed);
114 break;
115 }
116 }
117
118 _accessFlags = (ushort)((data[i++] << 8) + data[i++] );
119 _thisClass = (ushort)((data[i++] << 8) + data[i++] );
120 _supperClass = (ushort)((data[i++] << 8) + data[i++] );
121
122 if (this._constantsPool[this._thisClass - 1] is PoolClass)
123 {
124 this.mClass = ((PoolClass)this._constantsPool[this._thisClass - 1]);
125 }
126
127 _interfaceCount = (ushort)((data[i++] << 8) + data[i++]);
128 //should now read in the info for each interface
129 _fieldCount = (ushort)((data[i++] << 8) + data[i++]);
130 //should now read in the info for each field
131 _methodCount = (ushort)((data[i++] << 8) + data[i++]);
132 for (int count = 0; count < _methodCount; count++)
133 {
134 MethodInfo methInf = new MethodInfo(this);
135 methInf.ReadData(data, ref i);
136 this._methodsList.Add(methInf);
137 }
138 }
139
140 public void AddMethodsToMemory(MethodMemory memory)
141 {
142 for (int count = 0; count < _methodCount; count++)
143 {
144 this._methodsList[count].AddMethodCode(memory);
145 }
146 }
147
148 public bool StartMethod(Thread thread, string methodName)
149 {
150 for (int count = 0; count < _methodCount; count++)
151 {
152 if (this._constantsPool[this._methodsList[count].NameIndex-1] is PoolUtf8)
153 {
154 if (((PoolUtf8)this._constantsPool[this._methodsList[count].NameIndex-1]).Value == methodName)
155 {
156 //Console.WriteLine("found method: " + ((PoolUtf8)this._constantsPool[this._methodsList[count].NameIndex - 1]).Value);
157 thread.SetPC(this._methodsList[count].CodePointer);
158 return true;
159 }
160 }
161 }
162 return false;
163 }
164
165 public void PrintToConsole()
166 {
167 Console.WriteLine("Class File:");
168 Console.WriteLine("Major version: " + _majorVersion);
169 Console.WriteLine("Minor version: " + _minorVersion);
170 Console.WriteLine("Pool size: " + _constantPoolCount);
171
172 for (int i = 0; i < _constantsPool.Count; i++)
173 {
174 this._constantsPool[i].Print();
175 }
176
177 Console.WriteLine("Access flags: " + _accessFlags);
178 Console.WriteLine("This class: " + _thisClass );
179 Console.WriteLine("Super class: " + _supperClass);
180
181 for (int count = 0; count < _methodCount; count++)
182 {
183 Console.WriteLine();
184 this._methodsList[count].Print();
185 }
186
187 Console.WriteLine("class name is " + this.mClass.Name.Value);
188 }
189
190 public static byte[] ReadFully(Stream stream)
191 {
192 byte[] buffer = new byte[1024];
193 using (MemoryStream ms = new MemoryStream())
194 {
195 while (true)
196 {
197 int read = stream.Read(buffer, 0, buffer.Length);
198 if (read <= 0)
199 return ms.ToArray();
200 ms.Write(buffer, 0, read);
201 }
202 }
203 }
204
205 #region nested classes
206 public class PoolItem
207 {
208 public virtual void Print()
209 {
210
211 }
212 }
213
214 public class PoolUtf8 : PoolItem
215 {
216 public string Value = "";
217
218 public void readValue(byte[] data,ref int pointer , int length)
219 {
220 for (int i = 0; i < length; i++)
221 {
222 int a =(int) data[pointer++];
223 if ((a & 0x80) == 0)
224 {
225 Value = Value + (char)a;
226 }
227 else if ((a & 0x20) == 0)
228 {
229 int b = (int) data[pointer++];
230 Value = Value + (char)(((a & 0x1f) << 6) + (b & 0x3f));
231 }
232 else
233 {
234 int b = (int)data[pointer++];
235 int c = (int)data[pointer++];
236 Value = Value + (char)(((a & 0xf) << 12) + ((b & 0x3f) << 6) + (c & 0x3f));
237 }
238 }
239 }
240
241 public override void Print()
242 {
243 Console.WriteLine("Utf8 type: " + Value);
244 }
245 }
246
247 private class PoolInt : PoolItem
248 {
249
250 }
251
252 public class PoolClass : PoolItem
253 {
254 //public string name = "";
255 public ushort namePointer = 0;
256 private ClassRecord parent;
257 public PoolUtf8 Name;
258
259 public PoolClass(ClassRecord paren)
260 {
261 parent = paren;
262 }
263
264 public void readValue(byte[] data, ref int pointer)
265 {
266 namePointer = (ushort)((data[pointer++] << 8) + data[pointer++] );
267 }
268
269 public override void Print()
270 {
271 this.Name = ((PoolUtf8)this.parent._constantsPool[namePointer - 1]);
272 Console.Write("Class type: " + namePointer);
273 Console.WriteLine(" // " + ((PoolUtf8)this.parent._constantsPool[namePointer - 1]).Value);
274
275 }
276 }
277
278 public class PoolMethodRef : PoolItem
279 {
280 public ushort classPointer = 0;
281 public ushort nameTypePointer = 0;
282 public PoolNamedType mNameType;
283 public PoolClass mClass;
284 private ClassRecord parent;
285
286 public PoolMethodRef(ClassRecord paren)
287 {
288 parent = paren;
289 }
290
291 public void readValue(byte[] data, ref int pointer)
292 {
293 classPointer = (ushort)((data[pointer++] << 8) + data[pointer++]);
294 nameTypePointer = (ushort)((data[pointer++] << 8) + data[pointer++]);
295 }
296
297 public override void Print()
298 {
299 this.mNameType = ((PoolNamedType)this.parent._constantsPool[nameTypePointer - 1]);
300 this.mClass = ((PoolClass)this.parent._constantsPool[classPointer - 1]);
301 Console.WriteLine("MethodRef type: " + classPointer + " , " + nameTypePointer);
302 }
303 }
304
305 public class PoolNamedType : PoolItem
306 {
307 public ushort namePointer = 0;
308 public ushort typePointer = 0;
309 private ClassRecord parent;
310 public PoolUtf8 Name;
311 public PoolUtf8 Type;
312
313 public PoolNamedType(ClassRecord paren)
314 {
315 parent = paren;
316 }
317
318 public void readValue(byte[] data, ref int pointer)
319 {
320 namePointer = (ushort)((data[pointer++] << 8) + data[pointer++] );
321 typePointer = (ushort)((data[pointer++] << 8) + data[pointer++] );
322 }
323
324 public override void Print()
325 {
326 Name = ((PoolUtf8)this.parent._constantsPool[namePointer-1]);
327 Type = ((PoolUtf8)this.parent._constantsPool[typePointer-1]);
328 Console.Write("Named type: " + namePointer + " , " + typePointer );
329 Console.WriteLine(" // "+ ((PoolUtf8)this.parent._constantsPool[namePointer-1]).Value);
330 }
331 }
332
333 //***********************
334 public class MethodInfo
335 {
336 public ushort AccessFlags = 0;
337 public ushort NameIndex = 0;
338 public string Name = "";
339 public ushort DescriptorIndex = 0;
340 public ushort AttributeCount = 0;
341 public List<MethodAttribute> Attributes = new List<MethodAttribute>();
342 private ClassRecord parent;
343 public int CodePointer = 0;
344
345 public MethodInfo(ClassRecord paren)
346 {
347 parent = paren;
348 }
349
350 public void AddMethodCode(MethodMemory memory)
351 {
352 Array.Copy(this.Attributes[0].Code, 0, memory.MethodBuffer, memory.NextMethodPC, this.Attributes[0].Code.Length);
353 memory.Methodcount++;
354 this.CodePointer = memory.NextMethodPC;
355 memory.NextMethodPC += this.Attributes[0].Code.Length;
356 }
357
358 public void ReadData(byte[] data, ref int pointer)
359 {
360 AccessFlags = (ushort)((data[pointer++] << 8) + data[pointer++]);
361 NameIndex = (ushort)((data[pointer++] << 8) + data[pointer++]);
362 DescriptorIndex = (ushort)((data[pointer++] << 8) + data[pointer++]);
363 AttributeCount = (ushort)((data[pointer++] << 8) + data[pointer++]);
364 for(int i =0; i< AttributeCount; i++)
365 {
366 MethodAttribute attri = new MethodAttribute(this.parent);
367 attri.ReadData(data, ref pointer);
368 this.Attributes.Add(attri);
369 }
370 }
371
372 public void Print()
373 {
374 Console.WriteLine("Method Info Struct: ");
375 Console.WriteLine("AccessFlags: " + AccessFlags);
376 Console.WriteLine("NameIndex: " + NameIndex +" // "+ ((PoolUtf8)this.parent._constantsPool[NameIndex-1]).Value);
377 Console.WriteLine("DescriptorIndex: " + DescriptorIndex + " // "+ ((PoolUtf8)this.parent._constantsPool[DescriptorIndex-1]).Value);
378 Console.WriteLine("Attribute Count:" + AttributeCount);
379 for (int i = 0; i < AttributeCount; i++)
380 {
381 this.Attributes[i].Print();
382 }
383 }
384
385 public class MethodAttribute
386 {
387 public ushort NameIndex = 0;
388 public string Name = "";
389 public Int32 Length = 0;
390 //for now only support code attribute
391 public ushort MaxStack = 0;
392 public ushort MaxLocals = 0;
393 public Int32 CodeLength = 0;
394 public byte[] Code;
395 public ushort ExceptionTableLength = 0;
396 public ushort SubAttributeCount = 0;
397 public List<SubAttribute> SubAttributes = new List<SubAttribute>();
398 private ClassRecord parent;
399
400 public MethodAttribute(ClassRecord paren)
401 {
402 parent = paren;
403 }
404
405 public void ReadData(byte[] data, ref int pointer)
406 {
407 NameIndex = (ushort)((data[pointer++] << 8) + data[pointer++]);
408 Length = (Int32)((data[pointer++] << 24) + (data[pointer++] << 16) + (data[pointer++] << 8) + data[pointer++]);
409 MaxStack = (ushort)((data[pointer++] << 8) + data[pointer++]);
410 MaxLocals = (ushort)((data[pointer++] << 8) + data[pointer++]);
411 CodeLength = (Int32)((data[pointer++] << 24) + (data[pointer++] << 16) + (data[pointer++] << 8) + data[pointer++]);
412 Code = new byte[CodeLength];
413 for (int i = 0; i < CodeLength; i++)
414 {
415 Code[i] = data[pointer++];
416 }
417 ExceptionTableLength = (ushort)((data[pointer++] << 8) + data[pointer++]);
418 SubAttributeCount = (ushort)((data[pointer++] << 8) + data[pointer++]);
419 for (int i = 0; i < SubAttributeCount; i++)
420 {
421 SubAttribute subAttri = new SubAttribute(this.parent);
422 subAttri.ReadData(data, ref pointer);
423 this.SubAttributes.Add(subAttri);
424 }
425 }
426
427 public void Print()
428 {
429 Console.WriteLine("Method Attribute: ");
430 Console.WriteLine("Name Index: " + NameIndex + " // "+ ((PoolUtf8)this.parent._constantsPool[NameIndex-1]).Value);
431 Console.WriteLine("Length: " + Length);
432 Console.WriteLine("MaxStack: " + MaxStack);
433 Console.WriteLine("MaxLocals: " + MaxLocals);
434 Console.WriteLine("CodeLength: " + CodeLength);
435 for (int i = 0; i < Code.Length; i++)
436 {
437 Console.WriteLine("OpCode #" + i + " is: " + Code[i]);
438 }
439 Console.WriteLine("SubAttributes: " + SubAttributeCount);
440 for (int i = 0; i < SubAttributeCount; i++)
441 {
442 this.SubAttributes[i].Print();
443 }
444 }
445
446 public class SubAttribute
447 {
448 public ushort NameIndex = 0;
449 public string Name = "";
450 public Int32 Length = 0;
451 public byte[] Data;
452 private ClassRecord parent;
453
454 public SubAttribute(ClassRecord paren)
455 {
456 parent = paren;
457 }
458
459 public void ReadData(byte[] data, ref int pointer)
460 {
461 NameIndex = (ushort)((data[pointer++] << 8) + data[pointer++]);
462 Length = (Int32)((data[pointer++] << 24) + (data[pointer++] << 16) + (data[pointer++] << 8) + data[pointer++]);
463 Data = new byte[Length];
464 for (int i = 0; i < Length; i++)
465 {
466 Data[i] = data[pointer++];
467 }
468 }
469
470 public void Print()
471 {
472 Console.WriteLine("SubAttribute: NameIndex: " + NameIndex + " // " + ((PoolUtf8)this.parent._constantsPool[NameIndex - 1]).Value);
473 }
474
475 }
476 }
477
478 }
479 private class InterfaceInfo
480 {
481 public void ReadData(byte[] data, ref int i)
482 {
483
484 }
485 }
486 private class FieldInfo
487 {
488 public void ReadData(byte[] data, ref int i)
489 {
490
491 }
492 }
493 private class AttributeInfo
494 {
495 public void ReadData(byte[] data, ref int i)
496 {
497
498 }
499 }
500 #endregion
501
502 }
503}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs
new file mode 100644
index 0000000..f213c36
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs
@@ -0,0 +1,43 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32namespace OpenSim.Scripting.EmbeddedJVM
33{
34 public class Heap
35 {
36 public List<ClassInstance> ClassObjects = new List<ClassInstance>();
37
38 public Heap()
39 {
40
41 }
42 }
43}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs
new file mode 100644
index 0000000..c5995b2
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs
@@ -0,0 +1,135 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using OpenSim.Scripting.EmbeddedJVM.Types;
32using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes;
33
34namespace OpenSim.Scripting.EmbeddedJVM
35{
36 partial class Thread
37 {
38 private partial class Interpreter
39 {
40 private Thread _mThread;
41
42 public Interpreter(Thread parentThread)
43 {
44 _mThread = parentThread;
45 }
46
47 public bool Excute()
48 {
49 bool run = true;
50 byte currentOpCode = GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC++];
51 // Console.WriteLine("opCode is: " + currentOpCode);
52 bool handled = false;
53
54 handled = this.IsLogicOpCode(currentOpCode);
55 if (!handled)
56 {
57 handled = this.IsMethodOpCode(currentOpCode);
58 }
59 if (!handled)
60 {
61 if (currentOpCode == 172)
62 {
63 if (this._mThread.stack.StackFrames.Count > 1)
64 {
65 Console.WriteLine("returning int from function");
66 int retPC1 = this._mThread.currentFrame.ReturnPC;
67 BaseType bas1 = this._mThread.currentFrame.OpStack.Pop();
68 this._mThread.stack.StackFrames.Pop();
69 this._mThread.currentFrame = this._mThread.stack.StackFrames.Peek();
70 this._mThread.PC = retPC1;
71 if (bas1 is Int)
72 {
73 this._mThread.currentFrame.OpStack.Push((Int)bas1);
74 }
75 }
76 else
77 {
78 // Console.WriteLine("No parent function so ending program");
79 this._mThread.stack.StackFrames.Pop();
80 run = false;
81 }
82 handled = true;
83 }
84 if (currentOpCode == 174)
85 {
86 if (this._mThread.stack.StackFrames.Count > 1)
87 {
88 Console.WriteLine("returning float from function");
89 int retPC1 = this._mThread.currentFrame.ReturnPC;
90 BaseType bas1 = this._mThread.currentFrame.OpStack.Pop();
91 this._mThread.stack.StackFrames.Pop();
92 this._mThread.currentFrame = this._mThread.stack.StackFrames.Peek();
93 this._mThread.PC = retPC1;
94 if (bas1 is Float)
95 {
96 this._mThread.currentFrame.OpStack.Push((Float)bas1);
97 }
98 }
99 else
100 {
101 // Console.WriteLine("No parent function so ending program");
102 this._mThread.stack.StackFrames.Pop();
103 run = false;
104 }
105 handled = true;
106 }
107 if (currentOpCode == 177)
108 {
109 if (this._mThread.stack.StackFrames.Count > 1)
110 {
111 Console.WriteLine("returning from function");
112 int retPC = this._mThread.currentFrame.ReturnPC;
113 this._mThread.stack.StackFrames.Pop();
114 this._mThread.currentFrame = this._mThread.stack.StackFrames.Peek();
115 this._mThread.PC = retPC;
116 }
117 else
118 {
119 // Console.WriteLine("No parent function so ending program");
120 this._mThread.stack.StackFrames.Pop();
121 run = false;
122 }
123 handled = true;
124 }
125 }
126 if (!handled)
127 {
128 Console.WriteLine("opcode " + currentOpCode + " not been handled ");
129 }
130 return run;
131
132 }
133 }
134 }
135}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs
new file mode 100644
index 0000000..2a11afd
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs
@@ -0,0 +1,427 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using OpenSim.Scripting.EmbeddedJVM.Types;
32using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes;
33
34namespace OpenSim.Scripting.EmbeddedJVM
35{
36 partial class Thread
37 {
38 private partial class Interpreter
39 {
40 private bool IsLogicOpCode(byte opcode)
41 {
42 bool result = false;
43 switch (opcode)
44 {
45 case 2:
46 Int m_int= new Int();
47 m_int.mValue = -1;
48 this._mThread.currentFrame.OpStack.Push(m_int);
49 result = true;
50 break;
51 case 3:
52 m_int= new Int();
53 m_int.mValue = 0;
54 this._mThread.currentFrame.OpStack.Push(m_int);
55 result = true;
56 break;
57 case 4:
58 m_int = new Int();
59 m_int.mValue = 1;
60 this._mThread.currentFrame.OpStack.Push(m_int);
61 result = true;
62 break;
63 case 5:
64 m_int = new Int();
65 m_int.mValue = 2;
66 this._mThread.currentFrame.OpStack.Push(m_int);
67 result = true;
68 break;
69 case 6:
70 m_int = new Int();
71 m_int.mValue = 3;
72 this._mThread.currentFrame.OpStack.Push(m_int);
73 break;
74 case 7:
75 m_int = new Int();
76 m_int.mValue = 4;
77 this._mThread.currentFrame.OpStack.Push(m_int);
78 result = true;
79 break;
80 case 8:
81 m_int = new Int();
82 m_int.mValue = 5;
83 this._mThread.currentFrame.OpStack.Push(m_int);
84 result = true;
85 break;
86 case 11:
87 Float m_float = new Float();
88 m_float.mValue = 0.0f;
89 this._mThread.currentFrame.OpStack.Push(m_float);
90 result = true;
91 break;
92 case 12:
93 m_float = new Float();
94 m_float.mValue = 1.0f;
95 this._mThread.currentFrame.OpStack.Push(m_float);
96 result = true;
97 break;
98 case 13:
99 m_float = new Float();
100 m_float.mValue = 2.0f;
101 this._mThread.currentFrame.OpStack.Push(m_float);
102 result = true;
103 break;
104 case 16:
105 int pushvalue = (int)GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC];
106 Int pushInt = new Int();
107 pushInt.mValue = pushvalue;
108 this._mThread.currentFrame.OpStack.Push(pushInt);
109 this._mThread.PC++;
110 result = true;
111 break;
112 case 17:
113 short pushvalue2 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
114 Int pushInt2 = new Int();
115 pushInt2.mValue = pushvalue2;
116 this._mThread.currentFrame.OpStack.Push(pushInt2);
117 this._mThread.PC += 2;
118 result = true;
119 break;
120 case 23:
121 short findex1 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]));
122 Float fload = new Float();
123 if (this._mThread.currentFrame.LocalVariables[findex1] != null)
124 {
125 if (this._mThread.currentFrame.LocalVariables[findex1] is Float)
126 {
127 fload.mValue = ((Float)this._mThread.currentFrame.LocalVariables[findex1]).mValue;
128 this._mThread.currentFrame.OpStack.Push(fload);
129 }
130 }
131 this._mThread.PC++;
132 result = true;
133 break;
134 case 26:
135 if (this._mThread.currentFrame.LocalVariables[0] != null)
136 {
137 if (this._mThread.currentFrame.LocalVariables[0] is Int)
138 {
139 Int newInt = new Int();
140 newInt.mValue = ((Int)this._mThread.currentFrame.LocalVariables[0]).mValue;
141 this._mThread.currentFrame.OpStack.Push(newInt);
142 }
143 }
144 result = true;
145 break;
146 case 27:
147 if (this._mThread.currentFrame.LocalVariables[1] != null)
148 {
149 if (this._mThread.currentFrame.LocalVariables[1] is Int)
150 {
151 Int newInt = new Int();
152 newInt.mValue = ((Int)this._mThread.currentFrame.LocalVariables[1]).mValue;
153 this._mThread.currentFrame.OpStack.Push(newInt);
154 }
155 }
156 result = true;
157 break;
158 case 34:
159 if (this._mThread.currentFrame.LocalVariables[0] != null)
160 {
161 if (this._mThread.currentFrame.LocalVariables[0] is Float)
162 {
163 Float newfloat = new Float();
164 newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[0]).mValue;
165 this._mThread.currentFrame.OpStack.Push(newfloat);
166 }
167 }
168 result = true;
169 break;
170 case 35:
171 if (this._mThread.currentFrame.LocalVariables[1] != null)
172 {
173 if (this._mThread.currentFrame.LocalVariables[1] is Float)
174 {
175 Float newfloat = new Float();
176 newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[1]).mValue;
177 this._mThread.currentFrame.OpStack.Push(newfloat);
178 }
179 }
180 result = true;
181 break;
182 case 36:
183 if (this._mThread.currentFrame.LocalVariables[2] != null)
184 {
185 if (this._mThread.currentFrame.LocalVariables[2] is Float)
186 {
187 Float newfloat = new Float();
188 newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[2]).mValue;
189 this._mThread.currentFrame.OpStack.Push(newfloat);
190 }
191 }
192 result = true;
193 break;
194 case 37:
195 if (this._mThread.currentFrame.LocalVariables[3] != null)
196 {
197 if (this._mThread.currentFrame.LocalVariables[3] is Float)
198 {
199 Float newfloat = new Float();
200 newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[3]).mValue;
201 this._mThread.currentFrame.OpStack.Push(newfloat);
202 }
203 }
204 result = true;
205 break;
206 case 56:
207 short findex = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] ));
208 BaseType fstor = this._mThread.currentFrame.OpStack.Pop();
209 if (fstor is Float)
210 {
211 this._mThread.currentFrame.LocalVariables[findex] = (Float)fstor;
212 }
213 this._mThread.PC++;
214 result = true;
215 break;
216 case 59:
217 BaseType baset = this._mThread.currentFrame.OpStack.Pop();
218 if (baset is Int)
219 {
220 this._mThread.currentFrame.LocalVariables[0] = (Int)baset;
221 }
222 result = true;
223 break;
224 case 60:
225 baset = this._mThread.currentFrame.OpStack.Pop();
226 if (baset is Int)
227 {
228 this._mThread.currentFrame.LocalVariables[1] = (Int)baset;
229 }
230 result = true;
231 break;
232 case 67:
233 baset = this._mThread.currentFrame.OpStack.Pop();
234 if (baset is Float)
235 {
236 this._mThread.currentFrame.LocalVariables[0] = (Float)baset;
237 }
238 result = true;
239 break;
240 case 68:
241 baset = this._mThread.currentFrame.OpStack.Pop();
242 if (baset is Float)
243 {
244 this._mThread.currentFrame.LocalVariables[1] = (Float)baset;
245 }
246 result = true;
247 break;
248 case 69:
249 baset = this._mThread.currentFrame.OpStack.Pop();
250 if (baset is Float)
251 {
252 this._mThread.currentFrame.LocalVariables[2] = (Float)baset;
253 }
254 result = true;
255 break;
256 case 70:
257 baset = this._mThread.currentFrame.OpStack.Pop();
258 if (baset is Float)
259 {
260 this._mThread.currentFrame.LocalVariables[3] = (Float)baset;
261 }
262 result = true;
263 break;
264 case 87:
265 this._mThread.currentFrame.OpStack.Pop();
266 result = true;
267 break;
268 case 98:
269 BaseType bf2 = this._mThread.currentFrame.OpStack.Pop();
270 BaseType bf1 = this._mThread.currentFrame.OpStack.Pop();
271 if (bf1 is Float && bf2 is Float)
272 {
273 Float nflt = new Float();
274 nflt.mValue = ((Float)bf1).mValue + ((Float)bf2).mValue;
275 this._mThread.currentFrame.OpStack.Push(nflt);
276 }
277 result = true;
278 break;
279 case 102:
280 BaseType bsf2 = this._mThread.currentFrame.OpStack.Pop();
281 BaseType bsf1 = this._mThread.currentFrame.OpStack.Pop();
282 if (bsf1 is Float && bsf2 is Float)
283 {
284 Float resf = new Float();
285 resf.mValue = ((Float)bsf1).mValue - ((Float)bsf2).mValue;
286 this._mThread.currentFrame.OpStack.Push(resf);
287 }
288 result = true;
289 break;
290 case 104: //check the order of the two values off the stack is correct
291 BaseType bs2 = this._mThread.currentFrame.OpStack.Pop();
292 BaseType bs1 = this._mThread.currentFrame.OpStack.Pop();
293 if (bs1 is Int && bs2 is Int)
294 {
295 Int nInt = new Int();
296 nInt.mValue = ((Int)bs1).mValue * ((Int)bs2).mValue;
297 this._mThread.currentFrame.OpStack.Push(nInt);
298 }
299 result = true;
300 break;
301 case 132:
302 if (this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]] != null)
303 {
304 if (this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]] is Int)
305 {
306 ((Int)this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]]).mValue += (sbyte) GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1];
307 }
308 }
309 this._mThread.PC += 2;
310 result = true;
311 break;
312 case 139:
313 BaseType conv1 = this._mThread.currentFrame.OpStack.Pop();
314 if (conv1 is Float)
315 {
316 Int newconv = new Int();
317 newconv.mValue = (int)((Float)conv1).mValue;
318 this._mThread.currentFrame.OpStack.Push(newconv);
319 }
320 result = true;
321 break;
322 case 149:
323 BaseType flcom2 = this._mThread.currentFrame.OpStack.Pop();
324 BaseType flcom1 = this._mThread.currentFrame.OpStack.Pop();
325 if (flcom1 is Float && flcom2 is Float)
326 {
327 Int compres = new Int();
328 if (((Float)flcom1).mValue < ((Float)flcom2).mValue)
329 {
330 compres.mValue = -1;
331 }
332 else if (((Float)flcom1).mValue > ((Float)flcom2).mValue)
333 {
334 compres.mValue = 1;
335 }
336 else
337 {
338 compres.mValue = 0;
339 }
340 this._mThread.currentFrame.OpStack.Push(compres);
341 }
342 result = true;
343 break;
344 case 158:
345 short compareoffset1 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
346 BaseType comp1 = this._mThread.currentFrame.OpStack.Pop();
347 if (comp1 is Int)
348 {
349 if (((Int)comp1).mValue <= 0)
350 {
351 this._mThread.PC += -1 + compareoffset1;
352 }
353 else
354 {
355 this._mThread.PC += 2;
356 }
357 }
358 else
359 {
360 this._mThread.PC += 2;
361 }
362 result = true;
363 break;
364 case 162:
365 short compareoffset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
366 BaseType bc2 = this._mThread.currentFrame.OpStack.Pop();
367 BaseType bc1 = this._mThread.currentFrame.OpStack.Pop();
368 if (bc1 is Int && bc2 is Int)
369 {
370 //Console.WriteLine("comparing " + ((Int)bc1).mValue + " and " + ((Int)bc2).mValue);
371 if (((Int)bc1).mValue >= ((Int)bc2).mValue)
372 {
373 // Console.WriteLine("branch compare true , offset is " +compareoffset);
374 // Console.WriteLine("current PC is " + this._mThread.PC);
375 this._mThread.PC += -1 + compareoffset;
376 //Console.WriteLine("new PC is " + this._mThread.PC);
377 }
378 else
379 {
380 //Console.WriteLine("branch compare false");
381 this._mThread.PC += 2;
382 }
383 }
384 else
385 {
386 this._mThread.PC += 2;
387 }
388 result = true;
389 break;
390 case 164:
391 short compareloffset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
392 BaseType bcl2 = this._mThread.currentFrame.OpStack.Pop();
393 BaseType bcl1 = this._mThread.currentFrame.OpStack.Pop();
394 if (bcl1 is Int && bcl2 is Int)
395 {
396 //Console.WriteLine("comparing " + ((Int)bcl1).mValue + " and " + ((Int)bcl2).mValue);
397 if (((Int)bcl1).mValue <= ((Int)bcl2).mValue)
398 {
399 // Console.WriteLine("branch compare true , offset is " + compareloffset);
400 // Console.WriteLine("current PC is " + this._mThread.PC);
401 this._mThread.PC += -1 + compareloffset;
402 // Console.WriteLine("new PC is " + this._mThread.PC);
403 }
404 else
405 {
406 //Console.WriteLine("branch compare false");
407 this._mThread.PC += 2;
408 }
409 }
410 else
411 {
412 this._mThread.PC += 2;
413 }
414 result = true;
415 break;
416 case 167:
417 short offset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC+1]);
418 this._mThread.PC += -1 + offset;
419 result = true;
420 break;
421 }
422
423 return result;
424 }
425 }
426 }
427}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs
new file mode 100644
index 0000000..4d60559
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs
@@ -0,0 +1,96 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using OpenSim.Scripting.EmbeddedJVM.Types;
32using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes;
33using OpenSim.Framework.Interfaces;
34using OpenSim.Framework;
35using OpenSim.Framework.Types;
36
37namespace OpenSim.Scripting.EmbeddedJVM
38{
39 partial class Thread
40 {
41 private partial class Interpreter
42 {
43 private bool IsMethodOpCode(byte opcode)
44 {
45 bool result = false;
46 switch (opcode)
47 {
48 case 184:
49 short refIndex = (short) ((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC+1]);
50 if (this._mThread.currentClass._constantsPool[refIndex - 1] is ClassRecord.PoolMethodRef)
51 {
52 string typ = ((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Type.Value;
53 string typeparam = "";
54 string typereturn = "";
55 int firstbrak = 0;
56 int secondbrak = 0;
57 firstbrak = typ.LastIndexOf('(');
58 secondbrak = typ.LastIndexOf(')');
59 typeparam = typ.Substring(firstbrak + 1, secondbrak - firstbrak - 1);
60 typereturn = typ.Substring(secondbrak + 1, typ.Length - secondbrak - 1);
61 if (((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mClass.Name.Value == this._mThread.currentClass.mClass.Name.Value)
62 {
63 //calling a method in this class
64 if (typeparam.Length == 0)
65 {
66 this._mThread.JumpToStaticVoidMethod(((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Name.Value, (this._mThread.PC + 2));
67 }
68 else
69 {
70 this._mThread.JumpToStaticParamMethod(((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Name.Value, typeparam, (this._mThread.PC + 2));
71 }
72 }
73 else
74 {
75 //calling a method of a different class
76
77 // OpenSimAPI Class
78 if (((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mClass.Name.Value == "OpenSimAPI")
79 {
80 this._mThread.scriptInfo.api.CallMethod(((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Name.Value, null);
81 }
82 }
83 }
84 else
85 {
86 this._mThread.PC += 2;
87 }
88 result = true;
89 break;
90 }
91
92 return result;
93 }
94 }
95 }
96}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs
new file mode 100644
index 0000000..cbedb71
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs
@@ -0,0 +1,40 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32namespace OpenSim.Scripting.EmbeddedJVM
33{
34 partial class Thread
35 {
36 private partial class Interpreter
37 {
38 }
39 }
40}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs
new file mode 100644
index 0000000..1773156
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs
@@ -0,0 +1,29 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5using OpenSim.Region.Environment.Scripting;
6using OpenSim.Scripting.EmbeddedJVM;
7
8namespace OpenSim.Region.Environment.Scripting
9{
10 public class JavaEngine : IScriptCompiler
11 {
12 public string FileExt()
13 {
14 return ".java";
15 }
16
17 public Dictionary<string, IScript> compile(string filename)
18 {
19 JVMScript script = new JVMScript();
20 Dictionary<string, IScript> returns = new Dictionary<string, IScript>();
21
22 script.LoadScript(filename);
23
24 returns.Add(filename, script);
25
26 return returns;
27 }
28 }
29}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs
new file mode 100644
index 0000000..97d9fb6
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs
@@ -0,0 +1,45 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32namespace OpenSim.Scripting.EmbeddedJVM
33{
34 public class MainMemory
35 {
36 public Heap HeapArea;
37 public MethodMemory MethodArea;
38
39 public MainMemory()
40 {
41 MethodArea = new MethodMemory();
42 HeapArea = new Heap();
43 }
44 }
45}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs
new file mode 100644
index 0000000..7e938b4
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs
@@ -0,0 +1,46 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32namespace OpenSim.Scripting.EmbeddedJVM
33{
34 public class MethodMemory
35 {
36 public byte[] MethodBuffer;
37 public List<ClassRecord> Classes = new List<ClassRecord>();
38 public int NextMethodPC = 0;
39 public int Methodcount = 0;
40
41 public MethodMemory()
42 {
43 MethodBuffer = new byte[20000];
44 }
45 }
46}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs
new file mode 100644
index 0000000..2c3bedd
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs
@@ -0,0 +1,37 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32namespace OpenSim.Scripting.EmbeddedJVM
33{
34 public class Object
35 {
36 }
37}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs
new file mode 100644
index 0000000..3e083cc
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs
@@ -0,0 +1,171 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using System.IO;
32using System.Threading;
33using OpenSim.Framework;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Utilities;
36using OpenSim.Region.Environment.Scripting;
37using OpenSim.Region.Environment.Scenes;
38
39namespace OpenSim.Scripting.EmbeddedJVM
40{
41 public class JVMScript : IScript
42 {
43 private List<Thread> _threads = new List<Thread>();
44 private BlockingQueue<CompileInfo> CompileScripts = new BlockingQueue<CompileInfo>();
45 private MainMemory _mainMemory;
46 private System.Threading.Thread compileThread;
47
48 ScriptInfo scriptInfo;
49
50 public void Initialise(ScriptInfo info)
51 {
52 scriptInfo = info;
53
54 _mainMemory = new MainMemory();
55 Thread.GlobalMemory = this._mainMemory;
56 Thread.World = info.world;
57 CompileScript();
58
59 scriptInfo.events.OnFrame += new EventManager.OnFrameDelegate(events_OnFrame);
60 scriptInfo.events.OnNewPresence += new EventManager.OnNewPresenceDelegate(events_OnNewPresence);
61 }
62
63 void events_OnNewPresence(ScenePresence presence)
64 {
65 for (int i = 0; i < this._threads.Count; i++)
66 {
67 if (!this._threads[i].running)
68 {
69 this._threads[i].StartMethod("OnNewPresence");
70 bool run = true;
71 while (run)
72 {
73 run = this._threads[i].Excute();
74 }
75 }
76 }
77 }
78
79 void events_OnFrame()
80 {
81 for (int i = 0; i < this._threads.Count; i++)
82 {
83 if (!this._threads[i].running)
84 {
85 this._threads[i].StartMethod("OnFrame");
86 bool run = true;
87 while (run)
88 {
89 run = this._threads[i].Excute();
90 }
91 }
92 }
93 }
94
95 public string getName()
96 {
97 return "JVM Scripting Engine";
98 }
99
100 public void LoadScript(string script)
101 {
102 Console.WriteLine("OpenSimJVM - loading new script: " + script);
103 CompileInfo comp = new CompileInfo();
104 comp.script = script;
105 comp.scriptName = script;
106 this.CompileScripts.Enqueue(comp);
107 }
108
109 public void CompileScript()
110 {
111 CompileInfo comp = this.CompileScripts.Dequeue();
112 string script = comp.script;
113 string scriptName = comp.scriptName;
114 try
115 {
116 //need to compile the script into a java class file
117
118 //first save it to a java source file
119 TextWriter tw = new StreamWriter(scriptName + ".java");
120 tw.WriteLine(script);
121 tw.Close();
122
123 //now compile
124 System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("javac.exe", "*.java");
125 // psi.RedirectStandardOutput = true;
126 psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
127 psi.UseShellExecute = false;
128
129 System.Diagnostics.Process javacomp;
130 javacomp = System.Diagnostics.Process.Start(psi);
131 javacomp.WaitForExit();
132
133
134 //now load in class file
135 ClassRecord class1 = new ClassRecord();
136 class1.LoadClassFromFile(scriptName + ".class");
137 class1.PrintToConsole();
138 //Console.WriteLine();
139 this._mainMemory.MethodArea.Classes.Add(class1);
140 class1.AddMethodsToMemory(this._mainMemory.MethodArea);
141
142 Thread newThread = new Thread();
143 this._threads.Add(newThread);
144 newThread.currentClass = class1;
145 newThread.scriptInfo = scriptInfo;
146
147 //now delete the created files
148 System.IO.File.Delete(scriptName + ".java");
149 System.IO.File.Delete(scriptName + ".class");
150 //this.OnFrame();
151 }
152 catch (Exception e)
153 {
154 Console.WriteLine("exception");
155 Console.WriteLine(e.StackTrace);
156 Console.WriteLine(e.Message);
157 }
158 }
159
160 private class CompileInfo
161 {
162 public string script;
163 public string scriptName;
164
165 public CompileInfo()
166 {
167
168 }
169 }
170 }
171}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs
new file mode 100644
index 0000000..69a274c
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs
@@ -0,0 +1,42 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32namespace OpenSim.Scripting.EmbeddedJVM
33{
34 public class Stack
35 {
36 public Stack<StackFrame> StackFrames = new Stack<StackFrame>();
37
38 public Stack()
39 {
40 }
41 }
42}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs
new file mode 100644
index 0000000..3a2b58a
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs
@@ -0,0 +1,49 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using OpenSim.Scripting.EmbeddedJVM.Types;
32
33namespace OpenSim.Scripting.EmbeddedJVM
34{
35 public class StackFrame
36 {
37 public BaseType[] LocalVariables;
38 public Stack<BaseType> OpStack = new Stack<BaseType>();
39
40 public int ReturnPC = 0;
41 public ClassRecord CallingClass = null;
42
43 public StackFrame()
44 {
45 LocalVariables = new BaseType[20];
46 }
47
48 }
49}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs
new file mode 100644
index 0000000..3993436
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs
@@ -0,0 +1,119 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using OpenSim.Scripting.EmbeddedJVM.Types;
32using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes;
33using OpenSim.Framework;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Region.Environment.Scenes;
36using OpenSim.Region.Environment.Scripting;
37
38namespace OpenSim.Scripting.EmbeddedJVM
39{
40 public partial class Thread
41 {
42 // Is this smart?
43 public static MainMemory GlobalMemory;
44 public static Scene World;
45 private int PC = 0;
46 private Stack stack;
47 private Interpreter mInterpreter;
48 public ClassRecord currentClass;
49 public ClassInstance currentInstance;
50 private StackFrame currentFrame;
51 public int excutionCounter = 0;
52 public bool running = false;
53
54 public ScriptInfo scriptInfo;
55
56 public Thread()
57 {
58 this.mInterpreter = new Interpreter(this);
59 this.stack = new Stack();
60 }
61
62 public void SetPC(int methodpointer)
63 {
64 //Console.WriteLine("Thread PC has been set to " + methodpointer);
65 PC = methodpointer;
66 }
67
68 public void StartMethod(ClassRecord rec, string methName)
69 {
70 currentFrame = new StackFrame();
71 this.stack.StackFrames.Push(currentFrame);
72 this.currentClass = rec;
73 currentClass.StartMethod(this, methName);
74 }
75
76 public void StartMethod( string methName)
77 {
78 currentFrame = new StackFrame();
79 this.stack.StackFrames.Push(currentFrame);
80 currentClass.StartMethod(this, methName);
81 }
82
83 public void JumpToStaticVoidMethod(string methName, int returnPC)
84 {
85 currentFrame = new StackFrame();
86 currentFrame.ReturnPC = returnPC;
87 this.stack.StackFrames.Push(currentFrame);
88 currentClass.StartMethod(this, methName);
89 }
90
91 public void JumpToStaticParamMethod(string methName, string param, int returnPC)
92 {
93 if (param == "I")
94 {
95 BaseType bs1 = currentFrame.OpStack.Pop();
96 currentFrame = new StackFrame();
97 currentFrame.ReturnPC = returnPC;
98 this.stack.StackFrames.Push(currentFrame);
99 currentFrame.LocalVariables[0] = ((Int)bs1);
100 currentClass.StartMethod(this, methName);
101 }
102 if (param == "F")
103 {
104
105 }
106 }
107
108 public void JumpToClassStaticVoidMethod(string className, string methName, int returnPC)
109 {
110
111 }
112
113 public bool Excute()
114 {
115 excutionCounter++;
116 return this.mInterpreter.Excute();
117 }
118 }
119}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs
new file mode 100644
index 0000000..2854eab
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs
@@ -0,0 +1,10 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Scripting.EmbeddedJVM.Types
6{
7 public class ArrayReference :BaseType
8 {
9 }
10}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs
new file mode 100644
index 0000000..270aa7b
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs
@@ -0,0 +1,10 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Scripting.EmbeddedJVM.Types
6{
7 public class BaseType : Object
8 {
9 }
10}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs
new file mode 100644
index 0000000..da28eaa
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs
@@ -0,0 +1,16 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Scripting.EmbeddedJVM.Types
6{
7 public class ObjectReference : BaseType
8 {
9 public ushort Reference;
10
11 public ObjectReference()
12 {
13
14 }
15 }
16}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs
new file mode 100644
index 0000000..1a3ecff
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs
@@ -0,0 +1,10 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes
6{
7 public class Byte : BaseType
8 {
9 }
10}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs
new file mode 100644
index 0000000..19002d4
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs
@@ -0,0 +1,10 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes
6{
7 public class Char : BaseType
8 {
9 }
10}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs
new file mode 100644
index 0000000..91f1679
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs
@@ -0,0 +1,16 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes
6{
7 public class Float : BaseType
8 {
9 public float mValue = 0;
10
11 public Float()
12 {
13
14 }
15 }
16}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs
new file mode 100644
index 0000000..4ecd325
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs
@@ -0,0 +1,16 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes
6{
7 public class Int : BaseType
8 {
9 public int mValue = 0;
10
11 public Int()
12 {
13
14 }
15 }
16}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Script.cs b/OpenSim/Region/Environment/Scenes/scripting/Script.cs
new file mode 100644
index 0000000..139bdf1
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Script.cs
@@ -0,0 +1,64 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using OpenSim.Region.Environment.Scenes;
29
30namespace OpenSim.Region.Environment.Scripting
31{
32 public interface IScript
33 {
34 void Initialise(ScriptInfo scriptInfo);
35 string getName();
36 }
37
38 public class TestScript : IScript
39 {
40 ScriptInfo script;
41
42 public string getName()
43 {
44 return "TestScript 0.1";
45 }
46
47 public void Initialise(ScriptInfo scriptInfo)
48 {
49 script = scriptInfo;
50 script.events.OnFrame += new EventManager.OnFrameDelegate(events_OnFrame);
51 script.events.OnNewPresence += new EventManager.OnNewPresenceDelegate(events_OnNewPresence);
52 }
53
54 void events_OnNewPresence(ScenePresence presence)
55 {
56 script.logger.Verbose("Hello " + presence.firstname.ToString() + "!");
57 }
58
59 void events_OnFrame()
60 {
61 //script.logger.Verbose("Hello World!");
62 }
63 }
64}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs
new file mode 100644
index 0000000..fd601cb
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs
@@ -0,0 +1,25 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5using OpenSim.Region.Environment.Scenes;
6
7namespace OpenSim.Region.Environment.Scripting
8{
9 // This class is to be used for engines which may not be able to access the Scene directly.
10 // Scene access is preffered, but obviously not possible on some non-.NET languages.
11 public class ScriptAPI
12 {
13 Scene scene;
14
15 public ScriptAPI(Scene world)
16 {
17 scene = world;
18 }
19
20 public Object CallMethod(String method, Object[] args)
21 {
22 return null;
23 }
24 }
25}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs
new file mode 100644
index 0000000..ed6f033
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs
@@ -0,0 +1,58 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using OpenSim.Framework.Console;
29using OpenSim.Region.Environment.Scenes;
30
31namespace OpenSim.Region.Environment.Scripting
32{
33 /// <summary>
34 /// Class which provides access to the world
35 /// </summary>
36 public class ScriptInfo
37 {
38 // Reference to world.eventsManager provided for convenience
39 public EventManager events;
40
41 // The main world
42 public Scene world;
43
44 // The console
45 public LogBase logger;
46
47 // API Access
48 public ScriptAPI api;
49
50 public ScriptInfo(Scene scene)
51 {
52 world = scene;
53 events = world.eventManager;
54 logger = MainLog.Instance;
55 api = new ScriptAPI(scene);
56 }
57 }
58}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs
new file mode 100644
index 0000000..153f4d7
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs
@@ -0,0 +1,99 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Collections.Generic;
29using OpenSim.Framework.Console;
30using OpenSim.Region.Environment.Scenes;
31
32namespace OpenSim.Region.Environment.Scripting
33{
34 public class ScriptManager
35 {
36 List<IScript> scripts = new List<IScript>();
37 Scene scene;
38 Dictionary<string, IScriptCompiler> compilers = new Dictionary<string, IScriptCompiler>();
39
40 private void LoadFromCompiler(Dictionary<string, IScript> compiledscripts)
41 {
42 foreach (KeyValuePair<string, IScript> script in compiledscripts)
43 {
44 ScriptInfo scriptInfo = new ScriptInfo(scene); // Since each script could potentially corrupt their access with a stray assignment, making a new one for each script.
45 MainLog.Instance.Verbose("Loading " + script.Key);
46 script.Value.Initialise(scriptInfo);
47 scripts.Add(script.Value);
48 }
49 MainLog.Instance.Verbose("Finished loading " + compiledscripts.Count.ToString() + " script(s)");
50 }
51
52 public ScriptManager(Scene world)
53 {
54 scene = world;
55
56 // Default Engines
57 CSharpScriptEngine csharpCompiler = new CSharpScriptEngine();
58 compilers.Add(csharpCompiler.FileExt(),csharpCompiler);
59
60 JScriptEngine jscriptCompiler = new JScriptEngine();
61 compilers.Add(jscriptCompiler.FileExt(), jscriptCompiler);
62
63 JavaEngine javaCompiler = new JavaEngine();
64 compilers.Add(javaCompiler.FileExt(), javaCompiler);
65 }
66
67 public void Compile(string filename)
68 {
69 foreach (KeyValuePair<string, IScriptCompiler> compiler in compilers)
70 {
71 if (filename.EndsWith(compiler.Key))
72 {
73 LoadFromCompiler(compiler.Value.compile(filename));
74 break;
75 }
76 }
77 }
78
79 public void RunScriptCmd(string[] args)
80 {
81 switch (args[0])
82 {
83 case "load":
84 Compile(args[1]);
85 break;
86
87 default:
88 MainLog.Instance.Error("Unknown script command");
89 break;
90 }
91 }
92 }
93
94 interface IScriptCompiler
95 {
96 Dictionary<string,IScript> compile(string filename);
97 string FileExt();
98 }
99}
diff --git a/OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs b/OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs
new file mode 100644
index 0000000..d0ef2af
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs
@@ -0,0 +1,10 @@
1using System.Collections;
2using System.Text;
3using libsecondlife;
4using OpenSim.Region.Capabilities;
5using System.IO;
6
7namespace OpenSim.Framework.Servers
8{
9
10}
diff --git a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs
new file mode 100644
index 0000000..3c69420
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs
@@ -0,0 +1,93 @@
1using System.Collections.Generic;
2using libsecondlife;
3using OpenSim.Framework;
4using OpenSim.Framework.Communications;
5using OpenSim.Framework.Interfaces;
6using OpenSim.Framework.Servers;
7using OpenSim.Framework.Types;
8using OpenSim.Region.Caches;
9using OpenSim.Region.Environment.Scenes;
10using Avatar=OpenSim.Region.Environment.Scenes.ScenePresence;
11
12namespace SimpleApp
13{
14 public class MyWorld : Scene
15 {
16 private List<ScenePresence> m_avatars;
17
18 public MyWorld(ClientManager clientManager, RegionInfo regionInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer)
19 : base(clientManager, regionInfo, authen, commsMan, assetCach, httpServer)
20 {
21 m_avatars = new List<Avatar>();
22 }
23
24 public override void SendLayerData(IClientAPI remoteClient)
25 {
26 float[] map = new float[65536];
27
28 for (int i = 0; i < 65536; i++)
29 {
30 int x = i % 256;
31 int y = i / 256;
32
33 map[i] = (float)(x + y / 2);
34 }
35
36 remoteClient.SendLayerData(map);
37 }
38
39 #region IWorld Members
40
41 override public void AddNewClient(IClientAPI client, bool child)
42
43 {
44 LLVector3 pos = new LLVector3(128, 128, 128);
45
46 client.OnRegionHandShakeReply += SendLayerData;
47 client.OnChatFromViewer +=
48 delegate(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
49 {
50 // Echo it (so you know what you typed)
51 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
52 client.SendChatMessage("Ready.", 1, pos, "System", LLUUID.Zero );
53 };
54
55 client.OnRequestWearables += SendWearables;
56 client.OnAddPrim += AddNewPrim;
57 client.OnUpdatePrimGroupPosition += this.UpdatePrimPosition;
58 client.OnRequestMapBlocks += this.RequestMapBlocks;
59 client.OnTeleportLocationRequest += this.RequestTeleportLocation;
60 client.OnGrapUpdate += this.MoveObject;
61 client.OnNameFromUUIDRequest += this.commsManager.HandleUUIDNameRequest;
62
63 client.OnCompleteMovementToRegion += delegate()
64 {
65 client.MoveAgentIntoRegion(m_regInfo, pos, LLVector3.Zero );
66 };
67
68 client.OnCompleteMovementToRegion += delegate()
69 {
70 client.SendAvatarData(m_regInfo.RegionHandle, client.FirstName,
71 client.LastName, client.AgentId, 0,
72 pos, null);
73
74 client.SendChatMessage("Welcome to My World.", 1, pos, "System", LLUUID.Zero );
75
76
77
78 };
79
80 client.SendRegionHandshake(m_regInfo);
81
82 CreateAndAddScenePresence(client);
83
84 }
85
86 private void SendWearables( IClientAPI client )
87 {
88 client.SendWearables( AvatarWearable.DefaultWearables );
89 }
90
91 #endregion
92 }
93}
diff --git a/OpenSim/Region/Examples/SimpleApp/Program.cs b/OpenSim/Region/Examples/SimpleApp/Program.cs
new file mode 100644
index 0000000..87e877c
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/Program.cs
@@ -0,0 +1,130 @@
1using System;
2using System.Net;
3using libsecondlife;
4using OpenSim.Assets;
5using OpenSim.Framework;
6using OpenSim.Framework.Console;
7using OpenSim.Framework.Interfaces;
8using OpenSim.Framework.Servers;
9using OpenSim.Framework.Types;
10using OpenSim.Physics.Manager;
11using OpenSim.Region.Caches;
12using OpenSim.Region.Capabilities;
13using OpenSim.Region.ClientStack;
14using OpenSim.Region.Communications.Local;
15using OpenSim.Region.GridInterfaces.Local;
16
17namespace SimpleApp
18{
19 class Program : IAssetReceiver, conscmd_callback
20 {
21 private LogBase m_log;
22 AuthenticateSessionsBase m_circuitManager;
23 uint m_localId;
24
25 private void Run()
26 {
27 m_log = new LogBase(null, "SimpleApp", this, false);
28 MainLog.Instance = m_log;
29
30 // CheckSumServer checksumServer = new CheckSumServer(12036);
31 // checksumServer.ServerListener();
32
33 IPEndPoint internalEndPoint = new IPEndPoint( IPAddress.Parse( "127.0.0.1" ), 9000 );
34
35 m_circuitManager = new AuthenticateSessionsBase();
36
37 InventoryCache inventoryCache = new InventoryCache();
38
39 LocalAssetServer assetServer = new LocalAssetServer();
40 assetServer.SetServerInfo("http://127.0.0.1:8003/", "");
41 assetServer.SetReceiver(this);
42
43 AssetCache assetCache = new AssetCache(assetServer);
44
45 UDPServer udpServer = new UDPServer( internalEndPoint.Port, assetCache, inventoryCache, m_log, m_circuitManager );
46 PacketServer packetServer = new PacketServer(udpServer);
47 udpServer.ServerListener();
48
49 ClientView.TerrainManager = new TerrainManager(new SecondLife());
50 BaseHttpServer httpServer = new BaseHttpServer(internalEndPoint.Port);
51
52 NetworkServersInfo serverInfo = new NetworkServersInfo();
53 CommunicationsLocal communicationsManager = new CommunicationsLocal(serverInfo, httpServer);
54
55 RegionInfo regionInfo = new RegionInfo( 1000, 1000, internalEndPoint, "127.0.0.1" );
56
57 MyWorld world = new MyWorld(packetServer.ClientManager, regionInfo, m_circuitManager, communicationsManager, assetCache, httpServer);
58 world.PhysScene = PhysicsScene.Null;
59 udpServer.LocalWorld = world;
60
61 httpServer.AddXmlRPCHandler("login_to_simulator", communicationsManager.UserServices.XmlRpcLoginMethod );
62
63 httpServer.Start();
64
65 m_log.WriteLine( LogPriority.NORMAL, "Press enter to quit.");
66 m_log.ReadLine();
67
68 PrimData primData = new PrimData();
69 primData.Scale = new LLVector3(1, 1, 1);
70
71 m_localId = world.AddNewPrim( LLUUID.Zero, primData, LLVector3.Zero, new LLQuaternion(0, 0, 0, 0), LLUUID.Zero, 0);
72
73 }
74
75 private bool AddNewSessionHandler(ulong regionHandle, Login loginData)
76 {
77 m_log.WriteLine(LogPriority.NORMAL, "Region [{0}] recieved Login from [{1}] [{2}]", regionHandle, loginData.First, loginData.Last);
78
79 AgentCircuitData agent = new AgentCircuitData();
80 agent.AgentID = loginData.Agent;
81 agent.firstname = loginData.First;
82 agent.lastname = loginData.Last;
83 agent.SessionID = loginData.Session;
84 agent.SecureSessionID = loginData.SecureSession;
85 agent.circuitcode = loginData.CircuitCode;
86 agent.BaseFolder = loginData.BaseFolder;
87 agent.InventoryFolder = loginData.InventoryFolder;
88 agent.startpos = new LLVector3(128, 128, 70);
89
90 m_circuitManager.AddNewCircuit(agent.circuitcode, agent);
91
92 return true;
93 }
94
95 #region IAssetReceiver Members
96
97 public void AssetReceived( AssetBase asset, bool IsTexture)
98 {
99 throw new Exception("The method or operation is not implemented.");
100 }
101
102 public void AssetNotFound( AssetBase asset)
103 {
104 throw new Exception("The method or operation is not implemented.");
105 }
106
107 #endregion
108
109 #region conscmd_callback Members
110
111 public void RunCmd(string cmd, string[] cmdparams)
112 {
113 throw new Exception("The method or operation is not implemented.");
114 }
115
116 public void Show(string ShowWhat)
117 {
118 throw new Exception("The method or operation is not implemented.");
119 }
120
121 #endregion
122
123 static void Main(string[] args)
124 {
125 Program app = new Program();
126
127 app.Run();
128 }
129 }
130}
diff --git a/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs b/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..3b0de8a
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs
@@ -0,0 +1,31 @@
1using System.Reflection;
2using System.Runtime.InteropServices;
3// General Information about an assembly is controlled through the following
4// set of attributes. Change these attribute values to modify the information
5// associated with an assembly.
6[assembly: AssemblyTitle("SimpleApp")]
7[assembly: AssemblyDescription("")]
8[assembly: AssemblyConfiguration("")]
9[assembly: AssemblyCompany("Playahead AB")]
10[assembly: AssemblyProduct("SimpleApp")]
11[assembly: AssemblyCopyright("Copyright © Playahead AB 2007")]
12[assembly: AssemblyTrademark("")]
13[assembly: AssemblyCulture("")]
14
15// Setting ComVisible to false makes the types in this assembly not visible
16// to COM components. If you need to access a type in this assembly from
17// COM, set the ComVisible attribute to true on that type.
18[assembly: ComVisible(false)]
19
20// The following GUID is for the ID of the typelib if this project is exposed to COM
21[assembly: Guid("a5cfa45f-5acf-4b2e-9c50-1dd1fd7608ee")]
22
23// Version information for an assembly consists of the following four values:
24//
25// Major Version
26// Minor Version
27// Build Number
28// Revision
29//
30[assembly: AssemblyVersion("1.0.0.0")]
31[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs b/OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs
new file mode 100644
index 0000000..b5fc1ef
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// Information about this assembly is defined by the following
31// attributes.
32//
33// change them to the information which is associated with the assembly
34// you compile.
35
36[assembly: AssemblyTitle("LocalGridServers")]
37[assembly: AssemblyDescription("")]
38[assembly: AssemblyConfiguration("")]
39[assembly: AssemblyCompany("")]
40[assembly: AssemblyProduct("LocalGridServers")]
41[assembly: AssemblyCopyright("")]
42[assembly: AssemblyTrademark("")]
43[assembly: AssemblyCulture("")]
44
45// This sets the default COM visibility of types in the assembly to invisible.
46// If you need to expose a type to COM, use [ComVisible(true)] on that type.
47[assembly: ComVisible(false)]
48
49// The assembly version has following format :
50//
51// Major.Minor.Build.Revision
52//
53// You can specify all values by your own or you can build default build and revision
54// numbers with the '*' character (the default):
55
56[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..54d43a1
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Local/LocalAssetServer.cs
@@ -0,0 +1,311 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.IO;
30using System.Threading;
31using Db4objects.Db4o;
32using Db4objects.Db4o.Query;
33using libsecondlife;
34using OpenSim.Framework.Console;
35using OpenSim.Framework.Interfaces;
36using OpenSim.Framework.Types;
37using OpenSim.Framework.Utilities;
38
39namespace OpenSim.Region.GridInterfaces.Local
40{
41 public class LocalAssetPlugin : IAssetPlugin
42 {
43 public LocalAssetPlugin()
44 {
45
46 }
47
48 public IAssetServer GetAssetServer()
49 {
50 return (new LocalAssetServer());
51 }
52 }
53
54 public class LocalAssetServer : IAssetServer
55 {
56 private IAssetReceiver _receiver;
57 private BlockingQueue<ARequest> _assetRequests;
58 private IObjectContainer db;
59 private Thread _localAssetServerThread;
60
61 public LocalAssetServer()
62 {
63 bool yapfile;
64 this._assetRequests = new BlockingQueue<ARequest>();
65 yapfile = File.Exists("assets.yap");
66
67 MainLog.Instance.Verbose( "Local Asset Server class created");
68 try
69 {
70 db = Db4oFactory.OpenFile("assets.yap");
71 MainLog.Instance.Verbose( "Db4 Asset database creation");
72 }
73 catch (Exception e)
74 {
75 db.Close();
76 MainLog.Instance.WriteLine(LogPriority.MEDIUM, "Db4 Asset server :Constructor - Exception occured");
77 MainLog.Instance.Warn(e.ToString());
78 }
79 if (!yapfile)
80 {
81 this.SetUpAssetDatabase();
82 }
83 this._localAssetServerThread = new Thread(new ThreadStart(RunRequests));
84 this._localAssetServerThread.IsBackground = true;
85 this._localAssetServerThread.Start();
86
87 }
88
89 public void SetReceiver(IAssetReceiver receiver)
90 {
91 this._receiver = receiver;
92 }
93
94 public void RequestAsset(LLUUID assetID, bool isTexture)
95 {
96 ARequest req = new ARequest();
97 req.AssetID = assetID;
98 req.IsTexture = isTexture;
99 this._assetRequests.Enqueue(req);
100 }
101
102 public void UpdateAsset(AssetBase asset)
103 {
104
105 }
106
107 public void UploadNewAsset(AssetBase asset)
108 {
109 AssetStorage store = new AssetStorage();
110 store.Data = asset.Data;
111 store.Name = asset.Name;
112 store.UUID = asset.FullID;
113 db.Set(store);
114 db.Commit();
115 }
116
117 public void SetServerInfo(string ServerUrl, string ServerKey)
118 {
119
120 }
121 public void Close()
122 {
123 if (db != null)
124 {
125 MainLog.Instance.Verbose( "Closing local asset server database");
126 db.Close();
127 }
128 }
129
130 private void RunRequests()
131 {
132 while (true)
133 {
134 byte[] idata = null;
135 bool found = false;
136 AssetStorage foundAsset = null;
137 ARequest req = this._assetRequests.Dequeue();
138 IObjectSet result = db.Query(new AssetUUIDQuery(req.AssetID));
139 if (result.Count > 0)
140 {
141 foundAsset = (AssetStorage)result.Next();
142 found = true;
143 }
144
145 AssetBase asset = new AssetBase();
146 if (found)
147 {
148 asset.FullID = foundAsset.UUID;
149 asset.Type = foundAsset.Type;
150 asset.InvType = foundAsset.Type;
151 asset.Name = foundAsset.Name;
152 idata = foundAsset.Data;
153 }
154 else
155 {
156 asset.FullID = LLUUID.Zero;
157 }
158 asset.Data = idata;
159 _receiver.AssetReceived(asset, req.IsTexture);
160 }
161
162 }
163
164 private void SetUpAssetDatabase()
165 {
166 try
167 {
168
169 MainLog.Instance.Verbose( "Setting up asset database");
170
171 AssetBase Image = new AssetBase();
172 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001");
173 Image.Name = "Bricks";
174 this.LoadAsset(Image, true, "bricks.jp2");
175 AssetStorage store = new AssetStorage();
176 store.Data = Image.Data;
177 store.Name = Image.Name;
178 store.UUID = Image.FullID;
179 db.Set(store);
180 db.Commit();
181
182 Image = new AssetBase();
183 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002");
184 Image.Name = "Plywood";
185 this.LoadAsset(Image, true, "plywood.jp2");
186 store = new AssetStorage();
187 store.Data = Image.Data;
188 store.Name = Image.Name;
189 store.UUID = Image.FullID;
190 db.Set(store);
191 db.Commit();
192
193 Image = new AssetBase();
194 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000003");
195 Image.Name = "Rocks";
196 this.LoadAsset(Image, true, "rocks.jp2");
197 store = new AssetStorage();
198 store.Data = Image.Data;
199 store.Name = Image.Name;
200 store.UUID = Image.FullID;
201 db.Set(store);
202 db.Commit();
203
204 Image = new AssetBase();
205 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000004");
206 Image.Name = "Granite";
207 this.LoadAsset(Image, true, "granite.jp2");
208 store = new AssetStorage();
209 store.Data = Image.Data;
210 store.Name = Image.Name;
211 store.UUID = Image.FullID;
212 db.Set(store);
213 db.Commit();
214
215 Image = new AssetBase();
216 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000005");
217 Image.Name = "Hardwood";
218 this.LoadAsset(Image, true, "hardwood.jp2");
219 store = new AssetStorage();
220 store.Data = Image.Data;
221 store.Name = Image.Name;
222 store.UUID = Image.FullID;
223 db.Set(store);
224 db.Commit();
225
226 Image = new AssetBase();
227 Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005");
228 Image.Name = "Prim Base Texture";
229 this.LoadAsset(Image, true, "plywood.jp2");
230 store = new AssetStorage();
231 store.Data = Image.Data;
232 store.Name = Image.Name;
233 store.UUID = Image.FullID;
234 db.Set(store);
235 db.Commit();
236
237 Image = new AssetBase();
238 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000006");
239 Image.Name = "Map Base Texture";
240 this.LoadAsset(Image, true, "map_base.jp2");
241 store = new AssetStorage();
242 store.Data = Image.Data;
243 store.Name = Image.Name;
244 store.UUID = Image.FullID;
245 db.Set(store);
246 db.Commit();
247
248 Image = new AssetBase();
249 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000007");
250 Image.Name = "Map Texture";
251 this.LoadAsset(Image, true, "map1.jp2");
252 store = new AssetStorage();
253 store.Data = Image.Data;
254 store.Name = Image.Name;
255 store.UUID = Image.FullID;
256 db.Set(store);
257 db.Commit();
258
259 Image = new AssetBase();
260 Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
261 Image.Name = "Shape";
262 this.LoadAsset(Image, false, "base_shape.dat");
263 store = new AssetStorage();
264 store.Data = Image.Data;
265 store.Name = Image.Name;
266 store.UUID = Image.FullID;
267 db.Set(store);
268 db.Commit();
269 }
270 catch (Exception e)
271 {
272 Console.WriteLine("exception loading default assets into database");
273 Console.WriteLine(e.Message);
274 }
275
276 }
277
278 private void LoadAsset(AssetBase info, bool image, string filename)
279 {
280 //should request Asset from storage manager
281 //but for now read from file
282
283 string dataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "assets"); //+ folder;
284 string fileName = Path.Combine(dataPath, filename);
285 FileInfo fInfo = new FileInfo(fileName);
286 long numBytes = fInfo.Length;
287 FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
288 byte[] idata = new byte[numBytes];
289 BinaryReader br = new BinaryReader(fStream);
290 idata = br.ReadBytes((int)numBytes);
291 br.Close();
292 fStream.Close();
293 info.Data = idata;
294 //info.loaded=true;
295 }
296 }
297 public class AssetUUIDQuery : Predicate
298 {
299 private LLUUID _findID;
300
301 public AssetUUIDQuery(LLUUID find)
302 {
303 _findID = find;
304 }
305 public bool Match(AssetStorage asset)
306 {
307 return (asset.UUID == _findID);
308 }
309 }
310
311}
diff --git a/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs b/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs
new file mode 100644
index 0000000..1e15c5e
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// Information about this assembly is defined by the following
31// attributes.
32//
33// change them to the information which is associated with the assembly
34// you compile.
35
36[assembly: AssemblyTitle("RemoteGridServers")]
37[assembly: AssemblyDescription("")]
38[assembly: AssemblyConfiguration("")]
39[assembly: AssemblyCompany("")]
40[assembly: AssemblyProduct("RemoteGridServers")]
41[assembly: AssemblyCopyright("")]
42[assembly: AssemblyTrademark("")]
43[assembly: AssemblyCulture("")]
44
45// This sets the default COM visibility of types in the assembly to invisible.
46// If you need to expose a type to COM, use [ComVisible(true)] on that type.
47[assembly: ComVisible(false)]
48
49// The assembly version has following format :
50//
51// Major.Minor.Build.Revision
52//
53// You can specify all values by your own or you can build default build and revision
54// numbers with the '*' character (the default):
55
56[assembly: AssemblyVersion("1.0.*")]
diff --git a/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs b/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs
new file mode 100644
index 0000000..8643736
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs
@@ -0,0 +1,133 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.IO;
29using System.Net;
30using System.Text;
31using System.Threading;
32using libsecondlife;
33using OpenSim.Framework.Console;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36using OpenSim.Framework.Utilities;
37
38namespace OpenSim.Region.GridInterfaces.Remote
39{
40 public class RemoteAssetServer : IAssetServer
41 {
42 private IAssetReceiver _receiver;
43 private BlockingQueue<ARequest> _assetRequests;
44 private Thread _remoteAssetServerThread;
45 private string AssetServerUrl;
46 private string AssetSendKey;
47
48 public RemoteAssetServer()
49 {
50 this._assetRequests = new BlockingQueue<ARequest>();
51 this._remoteAssetServerThread = new Thread(new ThreadStart(RunRequests));
52 this._remoteAssetServerThread.IsBackground = true;
53 this._remoteAssetServerThread.Start();
54 MainLog.Instance.Verbose("Remote Asset Server class created");
55 }
56
57 public void SetReceiver(IAssetReceiver receiver)
58 {
59 this._receiver = receiver;
60 }
61
62 public void RequestAsset(LLUUID assetID, bool isTexture)
63 {
64 ARequest req = new ARequest();
65 req.AssetID = assetID;
66 req.IsTexture = isTexture;
67 this._assetRequests.Enqueue(req);
68 }
69
70 public void UpdateAsset(AssetBase asset)
71 {
72
73 }
74
75 public void UploadNewAsset(AssetBase asset)
76 {
77 Encoding Windows1252Encoding = Encoding.GetEncoding(1252);
78 string ret = Windows1252Encoding.GetString(asset.Data);
79 byte[] buffer = Windows1252Encoding.GetBytes(ret);
80 WebClient client = new WebClient();
81 client.UploadData(this.AssetServerUrl + "assets/" + asset.FullID, buffer);
82
83 }
84
85 public void SetServerInfo(string ServerUrl, string ServerKey)
86 {
87 this.AssetServerUrl = ServerUrl;
88 this.AssetSendKey = ServerKey;
89 }
90
91 private void RunRequests()
92 {
93 while (true)
94 {
95 //we need to add support for the asset server not knowing about a requested asset
96 // 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
97 ARequest req = this._assetRequests.Dequeue();
98 LLUUID assetID = req.AssetID;
99 // OpenSim.Framework.Console.MainLog.Instance.Verbose(" RemoteAssetServer- Got a AssetServer request, processing it - " + this.AssetServerUrl + "assets/" + assetID);
100 WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "assets/" + assetID);
101 WebResponse AssetResponse = AssetLoad.GetResponse();
102 byte[] idata = new byte[(int)AssetResponse.ContentLength];
103 BinaryReader br = new BinaryReader(AssetResponse.GetResponseStream());
104 idata = br.ReadBytes((int)AssetResponse.ContentLength);
105 br.Close();
106
107 AssetBase asset = new AssetBase();
108 asset.FullID = assetID;
109 asset.Data = idata;
110 _receiver.AssetReceived(asset, req.IsTexture);
111 }
112 }
113
114 public void Close()
115 {
116
117 }
118 }
119
120 public class RemoteAssetPlugin : IAssetPlugin
121 {
122 public RemoteAssetPlugin()
123 {
124
125 }
126
127 public IAssetServer GetAssetServer()
128 {
129 return (new RemoteAssetServer());
130 }
131 }
132
133}
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs
new file mode 100644
index 0000000..ce567a9
--- /dev/null
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// Information about this assembly is defined by the following
31// attributes.
32//
33// change them to the information which is associated with the assembly
34// you compile.
35
36[assembly: AssemblyTitle("PhysXplugin")]
37[assembly: AssemblyDescription("")]
38[assembly: AssemblyConfiguration("")]
39[assembly: AssemblyCompany("")]
40[assembly: AssemblyProduct("PhysXplugin")]
41[assembly: AssemblyCopyright("")]
42[assembly: AssemblyTrademark("")]
43[assembly: AssemblyCulture("")]
44
45// This sets the default COM visibility of types in the assembly to invisible.
46// If you need to expose a type to COM, use [ComVisible(true)] on that type.
47[assembly: ComVisible(false)]
48
49// The assembly version has following format :
50//
51// Major.Minor.Build.Revision
52//
53// You can specify all values by your own or you can build default build and revision
54// numbers with the '*' character (the default):
55
56[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..f133045
--- /dev/null
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
@@ -0,0 +1,301 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Collections.Generic;
29using Axiom.Math;
30using OpenSim.Physics.Manager;
31
32namespace OpenSim.Region.Physics.BasicPhysicsPlugin
33{
34 /// <summary>
35 /// Will be the PhysX plugin but for now will be a very basic physics engine
36 /// </summary>
37 public class BasicPhysicsPlugin : IPhysicsPlugin
38 {
39 private BasicScene _mScene;
40
41 public BasicPhysicsPlugin()
42 {
43
44 }
45
46 public bool Init()
47 {
48 return true;
49 }
50
51 public PhysicsScene GetScene()
52 {
53 return new BasicScene();
54 }
55
56 public string GetName()
57 {
58 return("basicphysics");
59 }
60
61 public void Dispose()
62 {
63
64 }
65 }
66
67 public class BasicScene :PhysicsScene
68 {
69 private List<BasicActor> _actors = new List<BasicActor>();
70 private float[] _heightMap;
71
72 public BasicScene()
73 {
74
75 }
76
77 public override PhysicsActor AddAvatar(PhysicsVector position)
78 {
79 BasicActor act = new BasicActor();
80 act.Position = position;
81 _actors.Add(act);
82 return act;
83 }
84
85 public override void RemoveAvatar(PhysicsActor actor)
86 {
87 BasicActor act = (BasicActor)actor;
88 if(_actors.Contains(act))
89 {
90 _actors.Remove(act);
91 }
92
93 }
94
95 public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
96 {
97 return null;
98 }
99
100 public override void Simulate(float timeStep)
101 {
102 foreach (BasicActor actor in _actors)
103 {
104 if ((actor.Position.Y > 0 && actor.Position.Y < 256) && (actor.Position.X > 0 && actor.Position.X < 256))
105 {
106 float height = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X] + 1.2f;
107 actor.Position.X = actor.Position.X + (actor.Velocity.X * timeStep);
108 actor.Position.Y = actor.Position.Y + (actor.Velocity.Y * timeStep);
109 if (actor.Flying)
110 {
111 if (actor.Position.Z + (actor.Velocity.Z * timeStep) <
112 _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X] + 2)
113 {
114 actor.Position.Z = height;
115 actor.Velocity.Z = 0;
116 }
117 else
118 {
119 actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep);
120 }
121 }
122 else
123 {
124 actor.Position.Z = height;
125 actor.Velocity.Z = 0;
126 }
127 }
128 else
129 {
130 if (actor.Position.Y < 0)
131 {
132 actor.Position.Y = 0;
133 }
134 else if (actor.Position.Y > 256)
135 {
136 actor.Position.Y = 256;
137 }
138
139 if (actor.Position.X < 0)
140 {
141 actor.Position.X = 0;
142 }
143 if (actor.Position.X > 256)
144 {
145 actor.Position.X = 256;
146 }
147 }
148 //}
149
150
151
152 // This code needs sorting out - border crossings etc
153/* if(actor.Position.X<0)
154 {
155 ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
156 actor.Position.X = 0;
157 actor.Velocity.X = 0;
158 }
159 if(actor.Position.Y < 0)
160 {
161 ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
162 actor.Position.Y = 0;
163 actor.Velocity.Y = 0;
164 }
165 if(actor.Position.X > 255)
166 {
167 ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
168 actor.Position.X = 255;
169 actor.Velocity.X = 0;
170 }
171 if(actor.Position.Y > 255)
172 {
173 ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
174 actor.Position.Y = 255;
175 actor.Velocity.X = 0;
176 }*/
177 }
178 }
179
180 public override void GetResults()
181 {
182
183 }
184
185 public override bool IsThreaded
186 {
187 get
188 {
189 return(false); // for now we won't be multithreaded
190 }
191 }
192
193 public override void SetTerrain(float[] heightMap)
194 {
195 this._heightMap = heightMap;
196 }
197
198 public override void DeleteTerrain()
199 {
200
201 }
202 }
203
204 public class BasicActor : PhysicsActor
205 {
206 private PhysicsVector _position;
207 private PhysicsVector _velocity;
208 private PhysicsVector _acceleration;
209 private bool flying;
210 public BasicActor()
211 {
212 _velocity = new PhysicsVector();
213 _position = new PhysicsVector();
214 _acceleration = new PhysicsVector();
215 }
216
217 public override bool Flying
218 {
219 get
220 {
221 return flying;
222 }
223 set
224 {
225 flying= value;
226 }
227 }
228
229 public override PhysicsVector Position
230 {
231 get
232 {
233 return _position;
234 }
235 set
236 {
237 _position = value;
238 }
239 }
240
241 public override PhysicsVector Velocity
242 {
243 get
244 {
245 return _velocity;
246 }
247 set
248 {
249 _velocity = value;
250 }
251 }
252
253 public override Quaternion Orientation
254 {
255 get
256 {
257 return Quaternion.Identity;
258 }
259 set
260 {
261
262 }
263 }
264
265 public override PhysicsVector Acceleration
266 {
267 get
268 {
269 return _acceleration;
270 }
271
272 }
273
274 public override bool Kinematic
275 {
276 get
277 {
278 return true;
279 }
280 set
281 {
282
283 }
284 }
285 public void SetAcceleration (PhysicsVector accel)
286 {
287 this._acceleration = accel;
288 }
289
290 public override void AddForce(PhysicsVector force)
291 {
292
293 }
294
295 public override void SetMomentum(PhysicsVector momentum)
296 {
297
298 }
299 }
300
301}
diff --git a/OpenSim/Region/Physics/Manager/AssemblyInfo.cs b/OpenSim/Region/Physics/Manager/AssemblyInfo.cs
new file mode 100644
index 0000000..9415db9
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/AssemblyInfo.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// Information about this assembly is defined by the following
31// attributes.
32//
33// change them to the information which is associated with the assembly
34// you compile.
35
36[assembly: AssemblyTitle("PhysicsManager")]
37[assembly: AssemblyDescription("")]
38[assembly: AssemblyConfiguration("")]
39[assembly: AssemblyCompany("")]
40[assembly: AssemblyProduct("PhysicsManager")]
41[assembly: AssemblyCopyright("")]
42[assembly: AssemblyTrademark("")]
43[assembly: AssemblyCulture("")]
44
45// This sets the default COM visibility of types in the assembly to invisible.
46// If you need to expose a type to COM, use [ComVisible(true)] on that type.
47[assembly: ComVisible(false)]
48
49// The assembly version has following format :
50//
51// Major.Minor.Build.Revision
52//
53// You can specify all values by your own or you can build default build and revision
54// numbers with the '*' character (the default):
55
56[assembly: AssemblyVersion("1.0.*")]
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
new file mode 100644
index 0000000..da3b560
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -0,0 +1,167 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using Axiom.Math;
29
30namespace OpenSim.Physics.Manager
31{
32 public delegate void PositionUpdate(PhysicsVector position);
33 public delegate void VelocityUpdate(PhysicsVector velocity);
34 public delegate void OrientationUpdate(Quaternion orientation);
35
36 public abstract class PhysicsActor
37 {
38 public event PositionUpdate OnPositionUpdate;
39 public event VelocityUpdate OnVelocityUpdate;
40 public event OrientationUpdate OnOrientationUpdate;
41
42 public static PhysicsActor Null
43 {
44 get
45 {
46 return new NullPhysicsActor();
47 }
48 }
49
50 public abstract PhysicsVector Position
51 {
52 get;
53 set;
54 }
55
56 public abstract PhysicsVector Velocity
57 {
58 get;
59 set;
60 }
61
62 public abstract PhysicsVector Acceleration
63 {
64 get;
65 }
66
67 public abstract Quaternion Orientation
68 {
69 get;
70 set;
71 }
72
73 public abstract bool Flying
74 {
75 get;
76 set;
77 }
78
79 public abstract bool Kinematic
80 {
81 get;
82 set;
83 }
84
85 public abstract void AddForce(PhysicsVector force);
86
87 public abstract void SetMomentum(PhysicsVector momentum);
88 }
89
90 public class NullPhysicsActor : PhysicsActor
91 {
92 public override PhysicsVector Position
93 {
94 get
95 {
96 return PhysicsVector.Zero;
97 }
98 set
99 {
100 return;
101 }
102 }
103
104 public override PhysicsVector Velocity
105 {
106 get
107 {
108 return PhysicsVector.Zero;
109 }
110 set
111 {
112 return;
113 }
114 }
115
116 public override Quaternion Orientation
117 {
118 get
119 {
120 return Quaternion.Identity;
121 }
122 set
123 {
124
125 }
126 }
127
128 public override PhysicsVector Acceleration
129 {
130 get { return PhysicsVector.Zero; }
131 }
132
133 public override bool Flying
134 {
135 get
136 {
137 return false;
138 }
139 set
140 {
141 return;
142 }
143 }
144
145 public override bool Kinematic
146 {
147 get
148 {
149 return true;
150 }
151 set
152 {
153 return;
154 }
155 }
156
157 public override void AddForce(PhysicsVector force)
158 {
159 return;
160 }
161
162 public override void SetMomentum(PhysicsVector momentum)
163 {
164 return;
165 }
166 }
167}
diff --git a/OpenSim/Region/Physics/Manager/PhysicsManager.cs b/OpenSim/Region/Physics/Manager/PhysicsManager.cs
new file mode 100644
index 0000000..265bce6
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/PhysicsManager.cs
@@ -0,0 +1,115 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.IO;
31using System.Reflection;
32using OpenSim.Framework.Console;
33
34namespace OpenSim.Physics.Manager
35{
36 /// <summary>
37 /// Description of MyClass.
38 /// </summary>
39 public class PhysicsManager
40 {
41 private Dictionary<string, IPhysicsPlugin> _plugins=new Dictionary<string, IPhysicsPlugin>();
42
43 public PhysicsManager()
44 {
45
46 }
47
48 public PhysicsScene GetPhysicsScene(string engineName)
49 {
50 if (String.IsNullOrEmpty(engineName))
51 {
52 return PhysicsScene.Null;
53 }
54
55 if(_plugins.ContainsKey(engineName))
56 {
57 MainLog.Instance.WriteLine(LogPriority.LOW,"creating "+engineName);
58 return _plugins[engineName].GetScene();
59 }
60 else
61 {
62 MainLog.Instance.WriteLine(LogPriority.MEDIUM,"couldn't find physicsEngine: {0}",engineName);
63 throw new ArgumentException(String.Format("couldn't find physicsEngine: {0}",engineName));
64 }
65 }
66
67 public void LoadPlugins()
68 {
69 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory ,"Physics");
70 string[] pluginFiles = Directory.GetFiles(path, "*.dll");
71
72
73 for(int i= 0; i<pluginFiles.Length; i++)
74 {
75 this.AddPlugin(pluginFiles[i]);
76 }
77 }
78
79 private void AddPlugin(string FileName)
80 {
81 Assembly pluginAssembly = Assembly.LoadFrom(FileName);
82
83 foreach (Type pluginType in pluginAssembly.GetTypes())
84 {
85 if (pluginType.IsPublic)
86 {
87 if (!pluginType.IsAbstract)
88 {
89 Type typeInterface = pluginType.GetInterface("IPhysicsPlugin", true);
90
91 if (typeInterface != null)
92 {
93 IPhysicsPlugin plug = (IPhysicsPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
94 plug.Init();
95 this._plugins.Add(plug.GetName(),plug);
96
97 }
98
99 typeInterface = null;
100 }
101 }
102 }
103
104 pluginAssembly = null;
105 }
106 }
107
108 public interface IPhysicsPlugin
109 {
110 bool Init();
111 PhysicsScene GetScene();
112 string GetName();
113 void Dispose();
114 }
115}
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
new file mode 100644
index 0000000..d44da00
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
@@ -0,0 +1,110 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using OpenSim.Framework.Console;
29
30namespace OpenSim.Physics.Manager
31{
32 public abstract class PhysicsScene
33 {
34 public static PhysicsScene Null
35 {
36 get
37 {
38 return new NullPhysicsScene();
39 }
40 }
41
42 public abstract PhysicsActor AddAvatar(PhysicsVector position);
43
44 public abstract void RemoveAvatar(PhysicsActor actor);
45
46 public abstract PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size);
47
48 public abstract void Simulate(float timeStep);
49
50 public abstract void GetResults();
51
52 public abstract void SetTerrain(float[] heightMap);
53
54 public abstract void DeleteTerrain();
55
56 public abstract bool IsThreaded
57 {
58 get;
59 }
60
61 private class NullPhysicsScene : PhysicsScene
62 {
63 private static int m_workIndicator;
64
65 public override PhysicsActor AddAvatar(PhysicsVector position)
66 {
67 MainLog.Instance.Verbose("NullPhysicsScene : AddAvatar({0})", position);
68 return PhysicsActor.Null;
69 }
70
71 public override void RemoveAvatar(PhysicsActor actor)
72 {
73
74 }
75
76 public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
77 {
78 MainLog.Instance.Verbose("NullPhysicsScene : AddPrim({0},{1})", position, size);
79 return PhysicsActor.Null;
80 }
81
82 public override void Simulate(float timeStep)
83 {
84 m_workIndicator = (m_workIndicator + 1) % 10;
85
86 //OpenSim.Framework.Console.MainLog.Instance.SetStatus(m_workIndicator.ToString());
87 }
88
89 public override void GetResults()
90 {
91 MainLog.Instance.Verbose("NullPhysicsScene : GetResults()");
92 }
93
94 public override void SetTerrain(float[] heightMap)
95 {
96 MainLog.Instance.Verbose("NullPhysicsScene : SetTerrain({0} items)", heightMap.Length);
97 }
98
99 public override void DeleteTerrain()
100 {
101
102 }
103
104 public override bool IsThreaded
105 {
106 get { return false; }
107 }
108 }
109 }
110}
diff --git a/OpenSim/Region/Physics/Manager/PhysicsVector.cs b/OpenSim/Region/Physics/Manager/PhysicsVector.cs
new file mode 100644
index 0000000..e75f29b
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/PhysicsVector.cs
@@ -0,0 +1,55 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28namespace OpenSim.Physics.Manager
29{
30 public class PhysicsVector
31 {
32 public float X;
33 public float Y;
34 public float Z;
35
36 public PhysicsVector()
37 {
38
39 }
40
41 public PhysicsVector(float x, float y, float z)
42 {
43 X = x;
44 Y = y;
45 Z = z;
46 }
47
48 public static readonly PhysicsVector Zero = new PhysicsVector(0f, 0f, 0f);
49
50 public override string ToString()
51 {
52 return "<" + this.X + "," + this.Y + "," + this.Z + ">";
53 }
54 }
55}
diff --git a/OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs
new file mode 100644
index 0000000..ee10430
--- /dev/null
+++ b/OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// Information about this assembly is defined by the following
31// attributes.
32//
33// change them to the information which is associated with the assembly
34// you compile.
35
36[assembly: AssemblyTitle("RealPhysXplugin")]
37[assembly: AssemblyDescription("")]
38[assembly: AssemblyConfiguration("")]
39[assembly: AssemblyCompany("")]
40[assembly: AssemblyProduct("RealPhysXplugin")]
41[assembly: AssemblyCopyright("")]
42[assembly: AssemblyTrademark("")]
43[assembly: AssemblyCulture("")]
44
45// This sets the default COM visibility of types in the assembly to invisible.
46// If you need to expose a type to COM, use [ComVisible(true)] on that type.
47[assembly: ComVisible(false)]
48
49// The assembly version has following format :
50//
51// Major.Minor.Build.Revision
52//
53// You can specify all values by your own or you can build default build and revision
54// numbers with the '*' character (the default):
55
56[assembly: AssemblyVersion("1.0.*")]
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
new file mode 100644
index 0000000..2780188
--- /dev/null
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -0,0 +1,457 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using Axiom.Math;
31using Ode.NET;
32using OpenSim.Physics.Manager;
33
34namespace OpenSim.Region.Physics.OdePlugin
35{
36 /// <summary>
37 /// ODE plugin
38 /// </summary>
39 public class OdePlugin : IPhysicsPlugin
40 {
41 private OdeScene _mScene;
42
43 public OdePlugin()
44 {
45
46 }
47
48 public bool Init()
49 {
50 return true;
51 }
52
53 public PhysicsScene GetScene()
54 {
55 if (_mScene == null)
56 {
57 _mScene = new OdeScene();
58 }
59 return (_mScene);
60 }
61
62 public string GetName()
63 {
64 return ("OpenDynamicsEngine");
65 }
66
67 public void Dispose()
68 {
69
70 }
71 }
72
73 public class OdeScene : PhysicsScene
74 {
75 static public IntPtr world;
76 static public IntPtr space;
77 static private IntPtr contactgroup;
78 static private IntPtr LandGeom;
79 //static private IntPtr Land;
80 private double[] _heightmap;
81 static private d.NearCallback nearCallback = near;
82 private List<OdeCharacter> _characters = new List<OdeCharacter>();
83 private static d.ContactGeom[] contacts = new d.ContactGeom[30];
84 private static d.Contact contact;
85
86 public OdeScene()
87 {
88 contact.surface.mode = d.ContactFlags.Bounce | d.ContactFlags.SoftCFM;
89 contact.surface.mu = d.Infinity;
90 contact.surface.mu2 = 0.0f;
91 contact.surface.bounce = 0.1f;
92 contact.surface.bounce_vel = 0.1f;
93 contact.surface.soft_cfm = 0.01f;
94
95 world = d.WorldCreate();
96 space = d.HashSpaceCreate(IntPtr.Zero);
97 contactgroup = d.JointGroupCreate(0);
98 d.WorldSetGravity(world, 0.0f, 0.0f, -0.5f);
99 //d.WorldSetCFM(world, 1e-5f);
100 d.WorldSetAutoDisableFlag(world, false);
101 d.WorldSetContactSurfaceLayer(world, 0.001f);
102 // d.CreatePlane(space, 0, 0, 1, 0);
103 this._heightmap = new double[65536];
104 }
105
106 // This function blatantly ripped off from BoxStack.cs
107 static private void near(IntPtr space, IntPtr g1, IntPtr g2)
108 {
109 IntPtr b1 = d.GeomGetBody(g1);
110 IntPtr b2 = d.GeomGetBody(g2);
111 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
112 return;
113
114 int count = d.Collide(g1, g2, 500, contacts, d.ContactGeom.SizeOf);
115 for (int i = 0; i < count; ++i)
116 {
117 contact.geom = contacts[i];
118 IntPtr joint = d.JointCreateContact(world, contactgroup, ref contact);
119 d.JointAttach(joint, b1, b2);
120 }
121
122 }
123
124 public override PhysicsActor AddAvatar(PhysicsVector position)
125 {
126 PhysicsVector pos = new PhysicsVector();
127 pos.X = position.X;
128 pos.Y = position.Y;
129 pos.Z = position.Z + 20;
130 OdeCharacter newAv = new OdeCharacter(this, pos);
131 this._characters.Add(newAv);
132 return newAv;
133 }
134
135 public override void RemoveAvatar(PhysicsActor actor)
136 {
137
138 }
139
140 public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
141 {
142 PhysicsVector pos = new PhysicsVector();
143 pos.X = position.X;
144 pos.Y = position.Y;
145 pos.Z = position.Z;
146 PhysicsVector siz = new PhysicsVector();
147 siz.X = size.X;
148 siz.Y = size.Y;
149 siz.Z = size.Z;
150 return new OdePrim();
151 }
152
153 public override void Simulate(float timeStep)
154 {
155 foreach (OdeCharacter actor in _characters)
156 {
157 actor.Move(timeStep * 5f);
158 }
159 d.SpaceCollide(space, IntPtr.Zero, nearCallback);
160 d.WorldQuickStep(world, timeStep * 5f);
161 d.JointGroupEmpty(contactgroup);
162 foreach (OdeCharacter actor in _characters)
163 {
164 actor.UpdatePosition();
165 }
166
167 }
168
169 public override void GetResults()
170 {
171
172 }
173
174 public override bool IsThreaded
175 {
176 get
177 {
178 return (false); // for now we won't be multithreaded
179 }
180 }
181
182 public override void SetTerrain(float[] heightMap)
183 {
184 for (int i = 0; i < 65536; i++)
185 {
186 // this._heightmap[i] = (double)heightMap[i];
187 // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...)
188 int x = i & 0xff;
189 int y = i >> 8;
190 this._heightmap[i] = (double)heightMap[x * 256 + y];
191 }
192 IntPtr HeightmapData = d.GeomHeightfieldDataCreate();
193 d.GeomHeightfieldDataBuildDouble(HeightmapData, _heightmap, 0, 256, 256, 256, 256, 1.0f, 0.0f, 2.0f, 0);
194 d.GeomHeightfieldDataSetBounds(HeightmapData, 256, 256);
195 LandGeom = d.CreateHeightfield(space, HeightmapData, 1);
196 d.Matrix3 R = new d.Matrix3();
197
198 Quaternion q1 =Quaternion.FromAngleAxis(1.5707f, new Vector3(1,0,0));
199 Quaternion q2 =Quaternion.FromAngleAxis(1.5707f, new Vector3(0,1,0));
200 //Axiom.Math.Quaternion q3 = Axiom.Math.Quaternion.FromAngleAxis(3.14f, new Axiom.Math.Vector3(0, 0, 1));
201
202 q1 = q1 * q2;
203 //q1 = q1 * q3;
204 Vector3 v3 = new Vector3();
205 float angle = 0;
206 q1.ToAngleAxis(ref angle, ref v3);
207
208 d.RFromAxisAndAngle(out R, v3.x, v3.y, v3.z, angle);
209 d.GeomSetRotation(LandGeom, ref R);
210 d.GeomSetPosition(LandGeom, 128, 128, 0);
211 }
212
213 public override void DeleteTerrain()
214 {
215
216 }
217 }
218
219 public class OdeCharacter : PhysicsActor
220 {
221 private PhysicsVector _position;
222 private PhysicsVector _velocity;
223 private PhysicsVector _acceleration;
224 private bool flying;
225 //private float gravityAccel;
226 private IntPtr BoundingCapsule;
227 IntPtr capsule_geom;
228 d.Mass capsule_mass;
229
230 public OdeCharacter(OdeScene parent_scene, PhysicsVector pos)
231 {
232 _velocity = new PhysicsVector();
233 _position = pos;
234 _acceleration = new PhysicsVector();
235 d.MassSetCapsule(out capsule_mass, 5.0f, 3, 0.5f, 2f);
236 capsule_geom = d.CreateCapsule(OdeScene.space, 0.5f, 2f);
237 this.BoundingCapsule = d.BodyCreate(OdeScene.world);
238 d.BodySetMass(BoundingCapsule, ref capsule_mass);
239 d.BodySetPosition(BoundingCapsule, pos.X, pos.Y, pos.Z);
240 d.GeomSetBody(capsule_geom, BoundingCapsule);
241 }
242
243 public override bool Flying
244 {
245 get
246 {
247 return flying;
248 }
249 set
250 {
251 flying = value;
252 }
253 }
254
255 public override PhysicsVector Position
256 {
257 get
258 {
259 return _position;
260 }
261 set
262 {
263 _position = value;
264 }
265 }
266
267 public override PhysicsVector Velocity
268 {
269 get
270 {
271 return _velocity;
272 }
273 set
274 {
275 _velocity = value;
276 }
277 }
278
279 public override bool Kinematic
280 {
281 get
282 {
283 return false;
284 }
285 set
286 {
287
288 }
289 }
290
291 public override Quaternion Orientation
292 {
293 get
294 {
295 return Quaternion.Identity;
296 }
297 set
298 {
299
300 }
301 }
302
303 public override PhysicsVector Acceleration
304 {
305 get
306 {
307 return _acceleration;
308 }
309
310 }
311 public void SetAcceleration(PhysicsVector accel)
312 {
313 this._acceleration = accel;
314 }
315
316 public override void AddForce(PhysicsVector force)
317 {
318
319 }
320
321 public override void SetMomentum(PhysicsVector momentum)
322 {
323
324 }
325
326 public void Move(float timeStep)
327 {
328 PhysicsVector vec = new PhysicsVector();
329 vec.X = this._velocity.X * timeStep;
330 vec.Y = this._velocity.Y * timeStep;
331 if (flying)
332 {
333 vec.Z = (this._velocity.Z + 0.5f) * timeStep;
334 }
335 d.BodySetLinearVel(this.BoundingCapsule, vec.X, vec.Y, vec.Z);
336 }
337
338 public void UpdatePosition()
339 {
340 d.Vector3 vec = d.BodyGetPosition(BoundingCapsule);
341 this._position.X = vec.X;
342 this._position.Y = vec.Y;
343 this._position.Z = vec.Z+1.0f;
344 }
345 }
346
347 public class OdePrim : PhysicsActor
348 {
349 private PhysicsVector _position;
350 private PhysicsVector _velocity;
351 private PhysicsVector _acceleration;
352
353 public OdePrim()
354 {
355 _velocity = new PhysicsVector();
356 _position = new PhysicsVector();
357 _acceleration = new PhysicsVector();
358 }
359 public override bool Flying
360 {
361 get
362 {
363 return false; //no flying prims for you
364 }
365 set
366 {
367
368 }
369 }
370 public override PhysicsVector Position
371 {
372 get
373 {
374 PhysicsVector pos = new PhysicsVector();
375 // PhysicsVector vec = this._prim.Position;
376 //pos.X = vec.X;
377 //pos.Y = vec.Y;
378 //pos.Z = vec.Z;
379 return pos;
380
381 }
382 set
383 {
384 /*PhysicsVector vec = value;
385 PhysicsVector pos = new PhysicsVector();
386 pos.X = vec.X;
387 pos.Y = vec.Y;
388 pos.Z = vec.Z;
389 this._prim.Position = pos;*/
390 }
391 }
392
393 public override PhysicsVector Velocity
394 {
395 get
396 {
397 return _velocity;
398 }
399 set
400 {
401 _velocity = value;
402 }
403 }
404
405 public override bool Kinematic
406 {
407 get
408 {
409 return false;
410 //return this._prim.Kinematic;
411 }
412 set
413 {
414 //this._prim.Kinematic = value;
415 }
416 }
417
418 public override Quaternion Orientation
419 {
420 get
421 {
422 Quaternion res = new Quaternion();
423 return res;
424 }
425 set
426 {
427
428 }
429 }
430
431 public override PhysicsVector Acceleration
432 {
433 get
434 {
435 return _acceleration;
436 }
437
438 }
439 public void SetAcceleration(PhysicsVector accel)
440 {
441 this._acceleration = accel;
442 }
443
444 public override void AddForce(PhysicsVector force)
445 {
446
447 }
448
449 public override void SetMomentum(PhysicsVector momentum)
450 {
451
452 }
453
454
455 }
456
457}
diff --git a/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs
new file mode 100644
index 0000000..ee10430
--- /dev/null
+++ b/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// Information about this assembly is defined by the following
31// attributes.
32//
33// change them to the information which is associated with the assembly
34// you compile.
35
36[assembly: AssemblyTitle("RealPhysXplugin")]
37[assembly: AssemblyDescription("")]
38[assembly: AssemblyConfiguration("")]
39[assembly: AssemblyCompany("")]
40[assembly: AssemblyProduct("RealPhysXplugin")]
41[assembly: AssemblyCopyright("")]
42[assembly: AssemblyTrademark("")]
43[assembly: AssemblyCulture("")]
44
45// This sets the default COM visibility of types in the assembly to invisible.
46// If you need to expose a type to COM, use [ComVisible(true)] on that type.
47[assembly: ComVisible(false)]
48
49// The assembly version has following format :
50//
51// Major.Minor.Build.Revision
52//
53// You can specify all values by your own or you can build default build and revision
54// numbers with the '*' character (the default):
55
56[assembly: AssemblyVersion("1.0.*")]
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
new file mode 100644
index 0000000..4c82549
--- /dev/null
+++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
@@ -0,0 +1,425 @@
1/*/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using OpenSim.Physics.Manager;
31using PhysXWrapper;
32using Quaternion=Axiom.Math.Quaternion;
33
34namespace OpenSim.Region.Physics.PhysXPlugin
35{
36 /// <summary>
37 /// Will be the PhysX plugin but for now will be a very basic physics engine
38 /// </summary>
39 public class PhysXPlugin : IPhysicsPlugin
40 {
41 private PhysXScene _mScene;
42
43 public PhysXPlugin()
44 {
45
46 }
47
48 public bool Init()
49 {
50 return true;
51 }
52
53 public PhysicsScene GetScene()
54 {
55 if(_mScene == null)
56 {
57 _mScene = new PhysXScene();
58 }
59 return(_mScene);
60 }
61
62 public string GetName()
63 {
64 return("RealPhysX");
65 }
66
67 public void Dispose()
68 {
69
70 }
71 }
72
73 public class PhysXScene :PhysicsScene
74 {
75 private List<PhysXCharacter> _characters = new List<PhysXCharacter>();
76 private List<PhysXPrim> _prims = new List<PhysXPrim>();
77 private float[] _heightMap = null;
78 private NxPhysicsSDK mySdk;
79 private NxScene scene;
80
81 public PhysXScene()
82 {
83 mySdk = NxPhysicsSDK.CreateSDK();
84 Console.WriteLine("Sdk created - now creating scene");
85 scene = mySdk.CreateScene();
86
87 }
88
89 public override PhysicsActor AddAvatar(PhysicsVector position)
90 {
91 Vec3 pos = new Vec3();
92 pos.X = position.X;
93 pos.Y = position.Y;
94 pos.Z = position.Z;
95 PhysXCharacter act = new PhysXCharacter( scene.AddCharacter(pos));
96 act.Position = position;
97 _characters.Add(act);
98 return act;
99 }
100
101 public override void RemoveAvatar(PhysicsActor actor)
102 {
103
104 }
105
106 public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
107 {
108 Vec3 pos = new Vec3();
109 pos.X = position.X;
110 pos.Y = position.Y;
111 pos.Z = position.Z;
112 Vec3 siz = new Vec3();
113 siz.X = size.X;
114 siz.Y = size.Y;
115 siz.Z = size.Z;
116 PhysXPrim act = new PhysXPrim( scene.AddNewBox(pos, siz));
117 _prims.Add(act);
118 return act;
119 }
120 public override void Simulate(float timeStep)
121 {
122 try
123 {
124 foreach (PhysXCharacter actor in _characters)
125 {
126 actor.Move(timeStep);
127 }
128 scene.Simulate(timeStep);
129 scene.FetchResults();
130 scene.UpdateControllers();
131
132 foreach (PhysXCharacter actor in _characters)
133 {
134 actor.UpdatePosition();
135 }
136 }
137 catch (Exception e)
138 {
139 Console.WriteLine(e.Message);
140 }
141
142 }
143
144 public override void GetResults()
145 {
146
147 }
148
149 public override bool IsThreaded
150 {
151 get
152 {
153 return(false); // for now we won't be multithreaded
154 }
155 }
156
157 public override void SetTerrain(float[] heightMap)
158 {
159 if (this._heightMap != null)
160 {
161 Console.WriteLine("PhysX - deleting old terrain");
162 this.scene.DeleteTerrain();
163 }
164 this._heightMap = heightMap;
165 this.scene.AddTerrain(heightMap);
166 }
167
168 public override void DeleteTerrain()
169 {
170 this.scene.DeleteTerrain();
171 }
172 }
173
174 public class PhysXCharacter : PhysicsActor
175 {
176 private PhysicsVector _position;
177 private PhysicsVector _velocity;
178 private PhysicsVector _acceleration;
179 private NxCharacter _character;
180 private bool flying;
181 private float gravityAccel;
182
183 public PhysXCharacter(NxCharacter character)
184 {
185 _velocity = new PhysicsVector();
186 _position = new PhysicsVector();
187 _acceleration = new PhysicsVector();
188 _character = character;
189 }
190
191 public override bool Flying
192 {
193 get
194 {
195 return flying;
196 }
197 set
198 {
199 flying = value;
200 }
201 }
202
203 public override PhysicsVector Position
204 {
205 get
206 {
207 return _position;
208 }
209 set
210 {
211 _position = value;
212 Vec3 ps = new Vec3();
213 ps.X = value.X;
214 ps.Y = value.Y;
215 ps.Z = value.Z;
216 this._character.Position = ps;
217 }
218 }
219
220 public override PhysicsVector Velocity
221 {
222 get
223 {
224 return _velocity;
225 }
226 set
227 {
228 _velocity = value;
229 }
230 }
231
232 public override bool Kinematic
233 {
234 get
235 {
236 return false;
237 }
238 set
239 {
240
241 }
242 }
243
244 public override Quaternion Orientation
245 {
246 get
247 {
248 return Quaternion.Identity;
249 }
250 set
251 {
252
253 }
254 }
255
256 public override PhysicsVector Acceleration
257 {
258 get
259 {
260 return _acceleration;
261 }
262
263 }
264 public void SetAcceleration (PhysicsVector accel)
265 {
266 this._acceleration = accel;
267 }
268
269 public override void AddForce(PhysicsVector force)
270 {
271
272 }
273
274 public override void SetMomentum(PhysicsVector momentum)
275 {
276
277 }
278
279 public void Move(float timeStep)
280 {
281 Vec3 vec = new Vec3();
282 vec.X = this._velocity.X * timeStep;
283 vec.Y = this._velocity.Y * timeStep;
284 if(flying)
285 {
286 vec.Z = ( this._velocity.Z) * timeStep;
287 }
288 else
289 {
290 gravityAccel+= -9.8f;
291 vec.Z = (gravityAccel + this._velocity.Z) * timeStep;
292 }
293 int res = this._character.Move(vec);
294 if(res == 1)
295 {
296 gravityAccel = 0;
297 }
298 }
299
300 public void UpdatePosition()
301 {
302 Vec3 vec = this._character.Position;
303 this._position.X = vec.X;
304 this._position.Y = vec.Y;
305 this._position.Z = vec.Z;
306 }
307 }
308
309 public class PhysXPrim : PhysicsActor
310 {
311 private PhysicsVector _position;
312 private PhysicsVector _velocity;
313 private PhysicsVector _acceleration;
314 private NxActor _prim;
315
316 public PhysXPrim(NxActor prim)
317 {
318 _velocity = new PhysicsVector();
319 _position = new PhysicsVector();
320 _acceleration = new PhysicsVector();
321 _prim = prim;
322 }
323 public override bool Flying
324 {
325 get
326 {
327 return false; //no flying prims for you
328 }
329 set
330 {
331
332 }
333 }
334 public override PhysicsVector Position
335 {
336 get
337 {
338 PhysicsVector pos = new PhysicsVector();
339 Vec3 vec = this._prim.Position;
340 pos.X = vec.X;
341 pos.Y = vec.Y;
342 pos.Z = vec.Z;
343 return pos;
344
345 }
346 set
347 {
348 PhysicsVector vec = value;
349 Vec3 pos = new Vec3();
350 pos.X = vec.X;
351 pos.Y = vec.Y;
352 pos.Z = vec.Z;
353 this._prim.Position = pos;
354 }
355 }
356
357 public override PhysicsVector Velocity
358 {
359 get
360 {
361 return _velocity;
362 }
363 set
364 {
365 _velocity = value;
366 }
367 }
368
369 public override bool Kinematic
370 {
371 get
372 {
373 return this._prim.Kinematic;
374 }
375 set
376 {
377 this._prim.Kinematic = value;
378 }
379 }
380
381 public override Quaternion Orientation
382 {
383 get
384 {
385 Quaternion res = new Quaternion();
386 PhysXWrapper.Quaternion quat = this._prim.GetOrientation();
387 res.w = quat.W;
388 res.x = quat.X;
389 res.y = quat.Y;
390 res.z = quat.Z;
391 return res;
392 }
393 set
394 {
395
396 }
397 }
398
399 public override PhysicsVector Acceleration
400 {
401 get
402 {
403 return _acceleration;
404 }
405
406 }
407 public void SetAcceleration (PhysicsVector accel)
408 {
409 this._acceleration = accel;
410 }
411
412 public override void AddForce(PhysicsVector force)
413 {
414
415 }
416
417 public override void SetMomentum(PhysicsVector momentum)
418 {
419
420 }
421
422
423 }
424
425}
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 @@
1using System.Reflection;
2using System.Runtime.CompilerServices;
3using System.Runtime.InteropServices;
4
5// General Information about an assembly is controlled through the following
6// set of attributes. Change these attribute values to modify the information
7// associated with an assembly.
8[assembly: AssemblyTitle("OpenSim.Scripting")]
9[assembly: AssemblyDescription("")]
10[assembly: AssemblyConfiguration("")]
11[assembly: AssemblyCompany("")]
12[assembly: AssemblyProduct("OpenSim.Scripting")]
13[assembly: AssemblyCopyright("Copyright © 2007")]
14[assembly: AssemblyTrademark("")]
15[assembly: AssemblyCulture("")]
16
17// Setting ComVisible to false makes the types in this assembly not visible
18// to COM components. If you need to access a type in this assembly from
19// COM, set the ComVisible attribute to true on that type.
20[assembly: ComVisible(false)]
21
22// The following GUID is for the ID of the typelib if this project is exposed to COM
23[assembly: Guid("61eae1ad-82aa-4c77-8bc5-b5a8c9522b18")]
24
25// Version information for an assembly consists of the following four values:
26//
27// Major Version
28// Minor Version
29// Build Number
30// Revision
31//
32// You can specify all the values or you can default the Revision and Build Numbers
33// by using the '*' as shown below:
34[assembly: AssemblyVersion("1.0.0.0")]
35[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 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5using OpenSim.Framework.Console;
6using OpenSim.Framework;
7using OpenSim.Region;
8using OpenSim.Region.Scenes;
9
10namespace OpenSim.Scripting
11{
12 public interface IScript
13 {
14 void Initialise(ScriptInfo scriptInfo);
15 }
16
17 public class TestScript : IScript
18 {
19 ScriptInfo script;
20
21 public void Initialise(ScriptInfo scriptInfo)
22 {
23 script = scriptInfo;
24 script.events.OnFrame += new OpenSim.Region.Scenes.EventManager.OnFrameDelegate(events_OnFrame);
25 }
26
27 void events_OnFrame()
28 {
29 script.logger.Verbose("Hello World!");
30 }
31 }
32}
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 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5using OpenSim.Region.Scenes;
6using OpenSim.Framework.Console;
7
8namespace OpenSim.Scripting
9{
10 /// <summary>
11 /// Class which provides access to the world
12 /// </summary>
13 public class ScriptInfo
14 {
15 // Reference to world.eventsManager provided for convenience
16 public EventManager events;
17
18 // The main world
19 public Scene world;
20
21 // The console
22 public LogBase logger;
23
24 public ScriptInfo(Scene scene)
25 {
26 world = scene;
27 events = world.eventManager;
28 logger = OpenSim.Framework.Console.MainLog.Instance;
29 }
30 }
31}
diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs
new file mode 100644
index 0000000..39ba6e4
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs
@@ -0,0 +1,112 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28
29// BDB Support
30// Apparently broken on Mono
31
32using BerkeleyDb;
33using libsecondlife;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36
37namespace OpenSim.Region.Storage.LocalStorageBDB
38{
39 public class BDBLocalStorage : ILocalStorage
40 {
41 const string simDbName = "localsim.db";
42
43 DbHash sim;
44 Db DB;
45 //BEFormatter formatter;
46
47 public BDBLocalStorage()
48 {
49 DB = new Db(DbCreateFlags.None);
50 sim = (DbHash)DB.Open(null, simDbName, null, DbType.Hash, Db.OpenFlags.Create, 0);
51 //vendorDb = (DbBTree)db.Open(null, VendorDbName, null, DbType.BTree, Db.OpenFlags.Create, 0);
52 }
53
54 public void Initialise(string file)
55 {
56 // Blank
57 }
58
59 public void StorePrim(PrimData prim)
60 {
61 DbEntry key = new DbEntry();
62 DbEntry data = new DbEntry();
63 lock (sim)
64 {
65 sim.PutUnique(null, ref key, ref data, DbFile.WriteFlags.AutoCommit);
66 }
67 }
68 public void RemovePrim(LLUUID primID)
69 {
70
71 }
72 public void LoadPrimitives(ILocalStorageReceiver receiver)
73 {
74
75 }
76 public float[] LoadWorld()
77 {
78 return new float[65536];
79 }
80 public void SaveMap(float[] heightmap)
81 {
82
83 }
84
85 public void SaveParcels(ParcelData[] parcel_data)
86 {
87 }
88
89 public void SaveParcel(ParcelData parcel)
90 {
91 }
92
93 public void RemoveParcel(ParcelData parcel)
94 {
95 }
96
97 public void RemoveAllParcels()
98 {
99 }
100
101 public void LoadParcels(ILocalStorageParcelReceiver recv)
102 {
103 recv.NoParcelDataFromStorage();
104 }
105
106 public void ShutDown()
107 {
108 sim.GetDb().Close();
109 DB.Close();
110 }
111 }
112} \ No newline at end of file
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs b/OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs
new file mode 100644
index 0000000..4463ac9
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// Information about this assembly is defined by the following
31// attributes.
32//
33// change them to the information which is associated with the assembly
34// you compile.
35
36[assembly: AssemblyTitle("Db4LocalStorage")]
37[assembly: AssemblyDescription("")]
38[assembly: AssemblyConfiguration("")]
39[assembly: AssemblyCompany("")]
40[assembly: AssemblyProduct("Db4LocalStorage")]
41[assembly: AssemblyCopyright("")]
42[assembly: AssemblyTrademark("")]
43[assembly: AssemblyCulture("")]
44
45// This sets the default COM visibility of types in the assembly to invisible.
46// If you need to expose a type to COM, use [ComVisible(true)] on that type.
47[assembly: ComVisible(false)]
48
49// The assembly version has following format :
50//
51// Major.Minor.Build.Revision
52//
53// You can specify all values by your own or you can build default build and revision
54// numbers with the '*' character (the default):
55
56[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..8214bc8
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs
@@ -0,0 +1,267 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using Db4objects.Db4o;
30using libsecondlife;
31using OpenSim.Framework.Console;
32using OpenSim.Framework.Interfaces;
33using OpenSim.Framework.Types;
34
35namespace OpenSim.Region.Storage.LocalStorageDb4o
36{
37 /// <summary>
38 ///
39 /// </summary>
40 public class Db4LocalStorage : ILocalStorage
41 {
42 private IObjectContainer db;
43 private string datastore;
44
45 public Db4LocalStorage()
46 {
47
48 }
49
50 public void Initialise(string dfile)
51 {
52 MainLog.Instance.Warn("Db4LocalStorage Opening " + dfile);
53 datastore = dfile;
54 try
55 {
56 db = Db4oFactory.OpenFile(datastore);
57 MainLog.Instance.Verbose("Db4LocalStorage creation");
58 }
59 catch (Exception e)
60 {
61 db.Close();
62 MainLog.Instance.Warn("Db4LocalStorage :Constructor - Exception occured");
63 MainLog.Instance.Warn(e.ToString());
64 }
65 }
66
67 public void StorePrim(PrimData prim)
68 {
69 IObjectSet result = db.Query(new UUIDPrimQuery(prim.FullID));
70 if (result.Count > 0)
71 {
72 //prim already in storage
73 //so update it
74 PrimData found = (PrimData)result.Next();
75 found.PathBegin = prim.PathBegin;
76 found.PathCurve = prim.PathCurve;
77 found.PathEnd = prim.PathEnd;
78 found.PathRadiusOffset = prim.PathRadiusOffset;
79 found.PathRevolutions = prim.PathRevolutions;
80 found.PathScaleX = prim.PathScaleX;
81 found.PathScaleY = prim.PathScaleY;
82 found.PathShearX = prim.PathShearX;
83 found.PathShearY = prim.PathShearY;
84 found.PathSkew = prim.PathSkew;
85 found.PathTaperX = prim.PathTaperX;
86 found.PathTaperY = prim.PathTaperY;
87 found.PathTwist = prim.PathTwist;
88 found.PathTwistBegin = prim.PathTwistBegin;
89 found.PCode = prim.PCode;
90 found.ProfileBegin = prim.ProfileBegin;
91 found.ProfileCurve = prim.ProfileCurve;
92 found.ProfileEnd = prim.ProfileEnd;
93 found.ProfileHollow = prim.ProfileHollow;
94 found.Position = prim.Position;
95 found.Rotation = prim.Rotation;
96 found.TextureEntry = prim.TextureEntry;
97 db.Set(found);
98 db.Commit();
99 }
100 else
101 {
102 //not in storage
103 db.Set(prim);
104 db.Commit();
105 }
106 }
107
108 public void RemovePrim(LLUUID primID)
109 {
110 IObjectSet result = db.Query(new UUIDPrimQuery(primID));
111 if (result.Count > 0)
112 {
113 PrimData found = (PrimData)result.Next();
114 db.Delete(found);
115 }
116 }
117
118
119 public void LoadPrimitives(ILocalStorageReceiver receiver)
120 {
121 IObjectSet result = db.Get(typeof(PrimData));
122 MainLog.Instance.Verbose("Db4LocalStorage.cs: LoadPrimitives() - number of prims in storages is " + result.Count);
123 foreach (PrimData prim in result)
124 {
125 receiver.PrimFromStorage(prim);
126 }
127 }
128
129 public float[] LoadWorld()
130 {
131 MainLog.Instance.Verbose("LoadWorld() - Loading world....");
132 float[] heightmap = null;
133 MainLog.Instance.Verbose("LoadWorld() - Looking for a heightmap in local DB");
134 IObjectSet world_result = db.Get(typeof(MapStorage));
135 if (world_result.Count > 0)
136 {
137 MainLog.Instance.Verbose("LoadWorld() - Found a heightmap in local database, loading");
138 MapStorage map = (MapStorage)world_result.Next();
139 //blank.LandMap = map.Map;
140 heightmap = map.Map;
141 }
142 return heightmap;
143 }
144
145 public void SaveMap(float[] heightmap)
146 {
147 IObjectSet world_result = db.Get(typeof(MapStorage));
148 if (world_result.Count > 0)
149 {
150 MainLog.Instance.Verbose("SaveWorld() - updating saved copy of heightmap in local database");
151 MapStorage map = (MapStorage)world_result.Next();
152 db.Delete(map);
153 }
154 MapStorage map1 = new MapStorage();
155 map1.Map = heightmap; //OpenSim_Main.local_world.LandMap;
156 db.Set(map1);
157 db.Commit();
158 }
159
160 public void SaveParcel(ParcelData parcel)
161 {
162 IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID));
163 if (result.Count > 0)
164 {
165 //Old Parcel
166 ParcelData updateParcel = (ParcelData)result.Next();
167 updateParcel.AABBMax = parcel.AABBMax;
168 updateParcel.AABBMin = parcel.AABBMin;
169 updateParcel.area = parcel.area;
170 updateParcel.auctionID = parcel.auctionID;
171 updateParcel.authBuyerID = parcel.authBuyerID;
172 updateParcel.category = parcel.category;
173 updateParcel.claimDate = parcel.claimDate;
174 updateParcel.claimPrice = parcel.claimPrice;
175 updateParcel.groupID = parcel.groupID;
176 updateParcel.groupPrims = parcel.groupPrims;
177 updateParcel.isGroupOwned = parcel.isGroupOwned;
178 updateParcel.landingType = parcel.landingType;
179 updateParcel.mediaAutoScale = parcel.mediaAutoScale;
180 updateParcel.mediaID = parcel.mediaID;
181 updateParcel.mediaURL = parcel.mediaURL;
182 updateParcel.musicURL = parcel.musicURL;
183 updateParcel.localID = parcel.localID;
184 updateParcel.ownerID = parcel.ownerID;
185 updateParcel.passHours = parcel.passHours;
186 updateParcel.passPrice = parcel.passPrice;
187 updateParcel.parcelBitmapByteArray = (byte[])parcel.parcelBitmapByteArray.Clone();
188 updateParcel.parcelDesc = parcel.parcelDesc;
189 updateParcel.parcelFlags = parcel.parcelFlags;
190 updateParcel.parcelName = parcel.parcelName;
191 updateParcel.parcelStatus = parcel.parcelStatus;
192 updateParcel.salePrice = parcel.salePrice;
193 updateParcel.snapshotID = parcel.snapshotID;
194 updateParcel.userLocation = parcel.userLocation;
195 updateParcel.userLookAt = parcel.userLookAt;
196
197 db.Set(updateParcel);
198 }
199 else
200 {
201 db.Set(parcel);
202 }
203 db.Commit();
204 }
205
206 public void SaveParcels(ParcelData[] parcel_data)
207 {
208 MainLog.Instance.Notice("Parcel Backup: Saving Parcels...");
209 int i;
210 for (i = 0; i < parcel_data.GetLength(0); i++)
211 {
212
213 SaveParcel(parcel_data[i]);
214
215 }
216 MainLog.Instance.Notice("Parcel Backup: Parcel Save Complete");
217 }
218
219 public void RemoveParcel(ParcelData parcel)
220 {
221 IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID));
222 if (result.Count > 0)
223 {
224 db.Delete(result[0]);
225 }
226 db.Commit();
227 }
228 public void RemoveAllParcels()
229 {
230 MainLog.Instance.Notice("Parcel Backup: Removing all parcels...");
231 IObjectSet result = db.Get(typeof(ParcelData));
232 if (result.Count > 0)
233 {
234 foreach (ParcelData parcelData in result)
235 {
236 RemoveParcel(parcelData);
237 }
238 }
239 }
240
241 public void LoadParcels(ILocalStorageParcelReceiver recv)
242 {
243 MainLog.Instance.Notice("Parcel Backup: Loading Parcels...");
244 IObjectSet result = db.Get(typeof(ParcelData));
245 if (result.Count > 0)
246 {
247 MainLog.Instance.Notice("Parcel Backup: Parcels exist in database.");
248 foreach (ParcelData parcelData in result)
249 {
250
251 recv.ParcelFromStorage(parcelData);
252 }
253 }
254 else
255 {
256 MainLog.Instance.Notice("Parcel Backup: No parcels exist. Creating basic parcel.");
257 recv.NoParcelDataFromStorage();
258 }
259 MainLog.Instance.Notice("Parcel Backup: Parcels Restored");
260 }
261 public void ShutDown()
262 {
263 db.Commit();
264 db.Close();
265 }
266 }
267} \ 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..ec82d02
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs
@@ -0,0 +1,39 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28namespace OpenSim.Region.Storage.LocalStorageDb4o
29{
30 public class MapStorage
31 {
32 public float[] Map;
33
34 public MapStorage()
35 {
36
37 }
38 }
39} \ No newline at end of file
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs
new file mode 100644
index 0000000..6e6768c
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs
@@ -0,0 +1,47 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using Db4objects.Db4o.Query;
29using libsecondlife;
30using OpenSim.Framework.Types;
31
32namespace OpenSim.Region.Storage.LocalStorageDb4o
33{
34 public class UUIDParcelQuery : Predicate
35 {
36 private LLUUID globalIDSearch;
37
38 public UUIDParcelQuery(LLUUID find)
39 {
40 globalIDSearch = find;
41 }
42 public bool Match(ParcelData parcel)
43 {
44 return (parcel.globalID == globalIDSearch);
45 }
46 }
47}
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs
new file mode 100644
index 0000000..eb309cb
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs
@@ -0,0 +1,47 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using Db4objects.Db4o.Query;
29using libsecondlife;
30using OpenSim.Framework.Types;
31
32namespace OpenSim.Region.Storage.LocalStorageDb4o
33{
34 public class UUIDPrimQuery : Predicate
35 {
36 private LLUUID _findID;
37
38 public UUIDPrimQuery(LLUUID find)
39 {
40 _findID = find;
41 }
42 public bool Match(PrimData prim)
43 {
44 return (prim.FullID == _findID);
45 }
46 }
47}
diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs b/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..ea9cda8
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// General Information about an assembly is controlled through the following
31// set of attributes. Change these attribute values to modify the information
32// associated with an assembly.
33[assembly: AssemblyTitle("OpenSim.Region.Storage.LocalStorageSQLite")]
34[assembly: AssemblyDescription("")]
35[assembly: AssemblyConfiguration("")]
36[assembly: AssemblyCompany("")]
37[assembly: AssemblyProduct("OpenSim.Region.Storage.LocalStorageSQLite")]
38[assembly: AssemblyCopyright("Copyright © 2007")]
39[assembly: AssemblyTrademark("")]
40[assembly: AssemblyCulture("")]
41
42// Setting ComVisible to false makes the types in this assembly not visible
43// to COM components. If you need to access a type in this assembly from
44// COM, set the ComVisible attribute to true on that type.
45[assembly: ComVisible(false)]
46
47// The following GUID is for the ID of the typelib if this project is exposed to COM
48[assembly: Guid("ecd6e0c1-7909-413e-9e3f-659678ac3bc3")]
49
50// Version information for an assembly consists of the following four values:
51//
52// Major Version
53// Minor Version
54// Build Number
55// Revision
56//
57// You can specify all the values or you can default the Revision and Build Numbers
58// by using the '*' as shown below:
59[assembly: AssemblyVersion("1.0.0.*")]
60[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..9900a98
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs
@@ -0,0 +1,198 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28
29// SQLite Support
30// A bad idea, but the IRC people told me to!
31
32using System;
33using System.Data;
34using System.Data.SQLite;
35using libsecondlife;
36using OpenSim.Framework.Console;
37using OpenSim.Framework.Interfaces;
38using OpenSim.Framework.Types;
39
40namespace OpenSim.Region.Storage.LocalStorageSQLite
41{
42 public class SQLiteLocalStorage : ILocalStorage
43 {
44 IDbConnection db;
45
46 public SQLiteLocalStorage()
47 {
48 try
49 {
50 string connectionstring = "URI=file:localsim.sdb";
51 db = (IDbConnection)new SQLiteConnection(connectionstring);
52 db.Open();
53 }
54 catch (Exception e)
55 {
56 db.Close();
57 MainLog.Instance.Warn("SQLiteLocalStorage :Constructor - Exception occured");
58 MainLog.Instance.Warn(e.ToString());
59 }
60 }
61
62 public void Initialise(string file)
63 {
64 // Blank
65 }
66
67 public void StorePrim(PrimData prim)
68 {
69 IDbCommand cmd = db.CreateCommand();
70
71 //SECURITY WARNING:
72 // These parameters wont produce SQL injections since they are all integer based, however.
73 // if inserting strings such as name or description, you will need to use appropriate
74 // measures to prevent SQL injection (although the value of SQL injection in this is limited).
75
76 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) ";
77 sql += "VALUES (";
78 sql += "\"" + prim.OwnerID.ToStringHyphenated() + "\","; // KILL ME NOW!
79 sql += "\"" + prim.PCode.ToString() + "\",";
80 sql += "\"" + prim.PathBegin.ToString() + "\",";
81 sql += "\"" + prim.PathEnd.ToString() + "\",";
82 sql += "\"" + prim.PathScaleX.ToString() + "\",";
83 sql += "\"" + prim.PathScaleY.ToString() + "\",";
84 sql += "\"" + prim.PathShearX.ToString() + "\",";
85 sql += "\"" + prim.PathShearY.ToString() + "\",";
86 sql += "\"" + prim.PathSkew.ToString() + "\",";
87 sql += "\"" + prim.ProfileBegin.ToString() + "\",";
88 sql += "\"" + prim.ProfileEnd.ToString() + "\",";
89 sql += "\"" + prim.Scale.ToString() + "\",";
90 sql += "\"" + prim.PathCurve.ToString() + "\",";
91 sql += "\"" + prim.ProfileCurve.ToString() + "\",";
92 sql += "\"" + prim.ParentID.ToString() + "\",";
93 sql += "\"" + prim.ProfileHollow.ToString() + "\",";
94 sql += "\"" + prim.PathRadiusOffset.ToString() + "\",";
95 sql += "\"" + prim.PathRevolutions.ToString() + "\",";
96 sql += "\"" + prim.PathTaperX.ToString() + "\",";
97 sql += "\"" + prim.PathTaperY.ToString() + "\",";
98 sql += "\"" + prim.PathTwist.ToString() + "\",";
99 sql += "\"" + prim.PathTwistBegin.ToString() + "\",";
100 sql += "\"" + prim.TextureEntry.ToString() + "\",";
101 sql += "\"" + prim.CreationDate.ToString() + "\",";
102 sql += "\"" + prim.OwnerMask.ToString() + "\",";
103 sql += "\"" + prim.NextOwnerMask.ToString() + "\",";
104 sql += "\"" + prim.GroupMask.ToString() + "\",";
105 sql += "\"" + prim.EveryoneMask.ToString() + "\",";
106 sql += "\"" + prim.BaseMask.ToString() + "\",";
107 sql += "\"" + prim.Position.ToString() + "\",";
108 sql += "\"" + prim.Rotation.ToString() + "\",";
109 sql += "\"" + prim.LocalID.ToString() + "\",";
110 sql += "\"" + prim.FullID.ToString() + "\")";
111
112 cmd.CommandText = sql;
113
114 try
115 {
116 cmd.ExecuteNonQuery();
117 }
118 catch (Exception e)
119 {
120 MainLog.Instance.Warn("SQLiteLocalStorage :StorePrim - Exception occured");
121 MainLog.Instance.Warn(e.ToString());
122 }
123
124 cmd.Dispose();
125 cmd = null;
126 }
127
128 public void RemovePrim(LLUUID primID)
129 {
130 IDbCommand cmd = db.CreateCommand();
131
132 //SECURITY WARNING:
133 // These parameters wont produce SQL injections since they are all integer based, however.
134 // if inserting strings such as name or description, you will need to use appropriate
135 // measures to prevent SQL injection (although the value of SQL injection in this is limited).
136
137 string sql = "DELETE FROM prim WHERE FullID = \"" + primID.ToStringHyphenated() + "\"";
138
139 cmd.CommandText = sql;
140
141 try
142 {
143 cmd.ExecuteNonQuery();
144 }
145 catch (Exception e)
146 {
147 MainLog.Instance.Warn("SQLiteLocalStorage :RemovePrim - Exception occured");
148 MainLog.Instance.Warn(e.ToString());
149 }
150
151 cmd.Dispose();
152 cmd = null;
153 }
154
155 public void LoadPrimitives(ILocalStorageReceiver receiver)
156 {
157
158 }
159
160 public float[] LoadWorld()
161 {
162 return new float[65536];
163 }
164
165 public void SaveMap(float[] heightmap)
166 {
167
168 }
169
170 public void SaveParcels(ParcelData[] parcel_manager)
171 {
172
173 }
174
175 public void SaveParcel(ParcelData parcel)
176 {
177 }
178
179 public void RemoveParcel(ParcelData parcel)
180 {
181 }
182
183 public void RemoveAllParcels()
184 {
185 }
186
187 public void LoadParcels(ILocalStorageParcelReceiver recv)
188 {
189 recv.NoParcelDataFromStorage();
190 }
191
192 public void ShutDown()
193 {
194 db.Close();
195 db = null;
196 }
197 }
198} \ No newline at end of file
diff --git a/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9c721d1
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System.Reflection;
29using System.Runtime.InteropServices;
30// General Information about an assembly is controlled through the following
31// set of attributes. Change these attribute values to modify the information
32// associated with an assembly.
33[assembly: AssemblyTitle("OpenSim.Region.Terrain.BasicTerrain")]
34[assembly: AssemblyDescription("")]
35[assembly: AssemblyConfiguration("")]
36[assembly: AssemblyCompany("")]
37[assembly: AssemblyProduct("OpenSim.Region.Terrain.BasicTerrain")]
38[assembly: AssemblyCopyright("Copyright © 2007")]
39[assembly: AssemblyTrademark("")]
40[assembly: AssemblyCulture("")]
41
42// Setting ComVisible to false makes the types in this assembly not visible
43// to COM components. If you need to access a type in this assembly from
44// COM, set the ComVisible attribute to true on that type.
45[assembly: ComVisible(false)]
46
47// The following GUID is for the ID of the typelib if this project is exposed to COM
48[assembly: Guid("3263f5b5-0a41-4ed5-91a2-9baaaeecc849")]
49
50// Version information for an assembly consists of the following four values:
51//
52// Major Version
53// Minor Version
54// Build Number
55// Revision
56//
57// You can specify all the values or you can default the Revision and Build Numbers
58// by using the '*' as shown below:
59[assembly: AssemblyVersion("1.0.0.0")]
60[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..6c9ec26
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
@@ -0,0 +1,928 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Drawing;
31using System.Drawing.Imaging;
32using System.IO;
33using libTerrain;
34using OpenJPEGNet;
35
36namespace OpenSim.Region.Terrain
37{
38 public class TerrainCommand
39 {
40 public virtual bool run(string[] cmdargs, ref string output)
41 {
42 return false;
43 }
44
45 public string args;
46 public string help;
47 }
48
49 public class TerrainEngine
50 {
51 /// <summary>
52 /// Plugin library for scripts
53 /// </summary>
54 public FilterHost customFilters = new FilterHost();
55
56 /// <summary>
57 /// A [normally] 256x256 heightmap
58 /// </summary>
59 public Channel heightmap;
60
61 /// <summary>
62 /// A copy of heightmap at the last save point (for reverting)
63 /// </summary>
64 public Channel revertmap;
65
66 /// <summary>
67 /// Water heightmap (needs clientside mods to work)
68 /// </summary>
69 public Channel watermap;
70
71 /// <summary>
72 /// Whether or not the terrain has been modified since it was last saved and sent to the Physics engine.
73 /// Counts the number of modifications since the last save. (0 = Untainted)
74 /// </summary>
75 public int tainted;
76
77 int w, h;
78
79 /// <summary>
80 /// Generate a new TerrainEngine instance and creates a new heightmap
81 /// </summary>
82 public TerrainEngine()
83 {
84 w = 256;
85 h = 256;
86 heightmap = new Channel(w, h);
87
88 tainted++;
89 }
90
91 /// <summary>
92 /// Converts the heightmap to a 65536 value 1D floating point array
93 /// </summary>
94 /// <returns>A float[65536] array containing the heightmap</returns>
95 public float[] getHeights1D()
96 {
97 float[] heights = new float[w * h];
98 int i;
99
100 for (i = 0; i < w * h; i++)
101 {
102 heights[i] = (float)heightmap.map[i / w, i % w];
103 }
104
105 return heights;
106 }
107
108 /// <summary>
109 /// Converts the heightmap to a 256x256 value 2D floating point array.
110 /// </summary>
111 /// <returns>An array of 256,256 values containing the heightmap</returns>
112 public float[,] getHeights2D()
113 {
114 float[,] heights = new float[w, h];
115 int x, y;
116 for (x = 0; x < w; x++)
117 {
118 for (y = 0; y < h; y++)
119 {
120 heights[x, y] = (float)heightmap.map[x, y];
121 }
122 }
123 return heights;
124 }
125
126 /// <summary>
127 /// Imports a 1D floating point array into the 2D heightmap array
128 /// </summary>
129 /// <param name="heights">The array to import (must have 65536 members)</param>
130 public void setHeights1D(float[] heights)
131 {
132 int i;
133 for (i = 0; i < w * h; i++)
134 {
135 heightmap.map[i / w, i % w] = heights[i];
136 }
137
138 tainted++;
139 }
140
141 /// <summary>
142 /// Loads a 2D array of values into the heightmap
143 /// </summary>
144 /// <param name="heights">An array of 256,256 float values</param>
145 public void setHeights2D(float[,] heights)
146 {
147 int x, y;
148 for (x = 0; x < w; x++)
149 {
150 for (y = 0; y < h; y++)
151 {
152 heightmap.set(x, y, (double)heights[x, y]);
153 }
154 }
155 tainted++;
156 }
157
158 /// <summary>
159 /// Swaps the two heightmap buffers (the 'revert map' and the heightmap)
160 /// </summary>
161 public void swapRevertMaps()
162 {
163 Channel backup = heightmap.copy();
164 heightmap = revertmap;
165 revertmap = backup;
166 }
167
168 /// <summary>
169 /// Saves the current heightmap into the revertmap
170 /// </summary>
171 public void saveRevertMap()
172 {
173 revertmap = heightmap.copy();
174 }
175
176 /// <summary>
177 /// Processes a terrain-specific command
178 /// </summary>
179 /// <param name="args">Commandline arguments (space seperated)</param>
180 /// <param name="resultText">Reference that returns error or help text if returning false</param>
181 /// <returns>If the operation was successful (if not, the error is placed into resultText)</returns>
182 public bool RunTerrainCmd(string[] args, ref string resultText, string simName)
183 {
184 string command = args[0];
185
186 try
187 {
188
189 switch (command)
190 {
191 case "help":
192 resultText += "terrain regenerate - rebuilds the sims terrain using a default algorithm\n";
193 resultText += "terrain voronoi <points> <blocksize> - generates a worley fractal with X points per block";
194 resultText += "terrain seed <seed> - sets the random seed value to <seed>\n";
195 resultText += "terrain load <type> <filename> - loads a terrain from disk, type can be 'F32', 'F64', 'RAW' or 'IMG'\n";
196 resultText += "terrain save <type> <filename> - saves a terrain to disk, type can be 'F32', 'F64', 'PNG', 'RAW' or 'HIRAW'\n";
197 resultText += "terrain save grdmap <filename> <gradient map> - creates a PNG snapshot of the region using a named gradient map\n";
198 resultText += "terrain rescale <min> <max> - rescales a terrain to be between <min> and <max> meters high\n";
199 resultText += "terrain erode aerobic <windspeed> <pickupmin> <dropmin> <carry> <rounds> <lowest>\n";
200 resultText += "terrain erode thermal <talus> <rounds> <carry>\n";
201 resultText += "terrain multiply <val> - multiplies a terrain by <val>\n";
202 resultText += "terrain revert - reverts the terrain to the stored original\n";
203 resultText += "terrain bake - saves the current terrain into the revert map\n";
204 resultText += "terrain csfilter <filename.cs> - loads a new filter from the specified .cs file\n";
205 resultText += "terrain jsfilter <filename.js> - loads a new filter from the specified .js file\n";
206 foreach (KeyValuePair<string, ITerrainFilter> filter in customFilters.filters)
207 {
208 resultText += filter.Value.Help();
209 }
210
211 return false;
212
213 case "revert":
214 swapRevertMaps();
215 saveRevertMap();
216 break;
217
218 case "bake":
219 saveRevertMap();
220 break;
221
222 case "seed":
223 setSeed(Convert.ToInt32(args[1]));
224 break;
225
226 case "erode":
227 return consoleErosion(args, ref resultText);
228
229 case "voronoi":
230 double[] c = new double[2];
231 c[0] = -1;
232 c[1] = 1;
233 heightmap.voronoiDiagram(Convert.ToInt32(args[1]), Convert.ToInt32(args[2]), c);
234 break;
235
236 case "hills":
237 return consoleHills(args, ref resultText);
238
239 case "regenerate":
240 hills();
241 break;
242
243 case "rescale":
244 setRange(Convert.ToSingle(args[1]), Convert.ToSingle(args[2]));
245 break;
246
247 case "multiply":
248 heightmap *= Convert.ToDouble(args[1]);
249 break;
250
251 case "load":
252 args[2].Replace("%name%", simName);
253 switch (args[1].ToLower())
254 {
255 case "f32":
256 loadFromFileF32(args[2]);
257 break;
258
259 case "f64":
260 loadFromFileF64(args[2]);
261 break;
262
263 case "raw":
264 loadFromFileSLRAW(args[2]);
265 break;
266
267 case "img":
268 heightmap.loadImage(args[2]);
269 return false;
270
271 default:
272 resultText = "Unknown image or data format";
273 return false;
274 }
275 break;
276
277 case "save":
278 args[2].Replace("%name%", simName);
279 switch (args[1].ToLower())
280 {
281 case "f32":
282 writeToFileF32(args[2]);
283 break;
284
285 case "f64":
286 writeToFileF64(args[2]);
287 break;
288
289 case "grdmap":
290 exportImage(args[2], args[3]);
291 break;
292
293 case "png":
294 heightmap.saveImage(args[2]);
295 break;
296
297 case "raw":
298 writeToFileRAW(args[2]);
299 break;
300
301 case "hiraw":
302 writeToFileHiRAW(args[2]);
303 break;
304
305 default:
306 resultText = "Unknown image or data format";
307 return false;
308 }
309 break;
310
311 case "csfilter":
312 customFilters.LoadFilterCSharp(args[1]);
313 break;
314 case "jsfilter":
315 customFilters.LoadFilterJScript(args[1]);
316 break;
317
318 default:
319 // Run any custom registered filters
320 if (customFilters.filters.ContainsKey(command))
321 {
322 customFilters.filters[command].Filter(heightmap, args);
323 break;
324 }
325 else
326 {
327 resultText = "Unknown terrain command";
328 return false;
329 }
330 }
331 return true;
332 }
333 catch (Exception e)
334 {
335 resultText = "Error running terrain command: " + e.ToString();
336 return false;
337 }
338 }
339
340 private bool consoleErosion(string[] args, ref string resultText)
341 {
342 switch (args[1].ToLower())
343 {
344 case "aerobic":
345 // WindSpeed, PickupMinimum,DropMinimum,Carry,Rounds,Lowest
346 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]));
347 break;
348 case "thermal":
349 heightmap.thermalWeathering(Convert.ToDouble(args[2]), Convert.ToInt32(args[3]), Convert.ToDouble(args[4]));
350 break;
351 default:
352 resultText = "Unknown erosion type";
353 return false;
354 }
355 return true;
356 }
357
358 private bool consoleHills(string[] args, ref string resultText)
359 {
360 int count;
361 double sizeMin;
362 double sizeRange;
363 bool island;
364 bool additive;
365 bool noisy;
366
367 if (args.GetLength(0) > 2)
368 {
369 count = Convert.ToInt32(args[2]);
370 sizeMin = Convert.ToDouble(args[3]);
371 sizeRange = Convert.ToDouble(args[4]);
372 island = Convert.ToBoolean(args[5]);
373 additive = Convert.ToBoolean(args[6]);
374 noisy = Convert.ToBoolean(args[7]);
375 }
376 else
377 {
378 count = 200;
379 sizeMin = 20;
380 sizeRange = 40;
381 island = true;
382 additive = true;
383 noisy = false;
384 }
385
386 switch (args[1].ToLower())
387 {
388 case "blocks":
389 heightmap.hillsBlocks(count, sizeMin, sizeRange, island, additive, noisy);
390 break;
391 case "cones":
392 heightmap.hillsCones(count, sizeMin, sizeRange, island, additive, noisy);
393 break;
394 case "spheres":
395 heightmap.hillsSpheres(count, sizeMin, sizeRange, island, additive, noisy);
396 break;
397 case "squared":
398 heightmap.hillsSquared(count, sizeMin, sizeRange, island, additive, noisy);
399 break;
400 default:
401 resultText = "Unknown hills type";
402 return false;
403 }
404 return true;
405 }
406
407 /// <summary>
408 /// Renormalises the array between min and max
409 /// </summary>
410 /// <param name="min">Minimum value of the new array</param>
411 /// <param name="max">Maximum value of the new array</param>
412 public void setRange(float min, float max)
413 {
414 heightmap.normalise((double)min, (double)max);
415 tainted++;
416 }
417
418 /// <summary>
419 /// Loads a file consisting of 256x256 doubles and imports it as an array into the map.
420 /// </summary>
421 /// <remarks>TODO: Move this to libTerrain itself</remarks>
422 /// <param name="filename">The filename of the double array to import</param>
423 public void loadFromFileF64(string filename)
424 {
425 FileInfo file = new FileInfo(filename);
426 FileStream s = file.Open(FileMode.Open, FileAccess.Read);
427 BinaryReader bs = new BinaryReader(s);
428 int x, y;
429 for (x = 0; x < w; x++)
430 {
431 for (y = 0; y < h; y++)
432 {
433 heightmap.map[x, y] = bs.ReadDouble();
434 }
435 }
436
437 bs.Close();
438 s.Close();
439
440 tainted++;
441 }
442
443 /// <summary>
444 /// Loads a file consisting of 256x256 floats and imports it as an array into the map.
445 /// </summary>
446 /// <remarks>TODO: Move this to libTerrain itself</remarks>
447 /// <param name="filename">The filename of the float array to import</param>
448 public void loadFromFileF32(string filename)
449 {
450 FileInfo file = new FileInfo(filename);
451 FileStream s = file.Open(FileMode.Open, FileAccess.Read);
452 BinaryReader bs = new BinaryReader(s);
453 int x, y;
454 for (x = 0; x < w; x++)
455 {
456 for (y = 0; y < h; y++)
457 {
458 heightmap.map[x, y] = (double)bs.ReadSingle();
459 }
460 }
461
462 bs.Close();
463 s.Close();
464
465 tainted++;
466 }
467
468 /// <summary>
469 /// Loads a file formatted in the SL .RAW Format used on the main grid
470 /// </summary>
471 /// <remarks>This file format stinks and is best avoided.</remarks>
472 /// <param name="filename">A path to the .RAW format</param>
473 public void loadFromFileSLRAW(string filename)
474 {
475 FileInfo file = new FileInfo(filename);
476 FileStream s = file.Open(FileMode.Open, FileAccess.Read);
477 BinaryReader bs = new BinaryReader(s);
478 int x, y;
479 for (x = 0; x < w; x++)
480 {
481 for (y = 0; y < h; y++)
482 {
483 heightmap.map[x, y] = (double)bs.ReadByte() * ((double)bs.ReadByte() / 127.0);
484 bs.ReadBytes(11); // Advance the stream to next bytes.
485 }
486 }
487
488 bs.Close();
489 s.Close();
490
491 tainted++;
492 }
493
494 /// <summary>
495 /// Writes the current terrain heightmap to disk, in the format of a 65536 entry double[] array.
496 /// </summary>
497 /// <param name="filename">The desired output filename</param>
498 public void writeToFileF64(string filename)
499 {
500 FileInfo file = new FileInfo(filename);
501 FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write);
502 BinaryWriter bs = new BinaryWriter(s);
503
504 int x, y;
505 for (x = 0; x < w; x++)
506 {
507 for (y = 0; y < h; y++)
508 {
509 bs.Write(heightmap.get(x, y));
510 }
511 }
512
513 bs.Close();
514 s.Close();
515 }
516
517 /// <summary>
518 /// Writes the current terrain heightmap to disk, in the format of a 65536 entry float[] array
519 /// </summary>
520 /// <param name="filename">The desired output filename</param>
521 public void writeToFileF32(string filename)
522 {
523 FileInfo file = new FileInfo(filename);
524 FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write);
525 BinaryWriter bs = new BinaryWriter(s);
526
527 int x, y;
528 for (x = 0; x < w; x++)
529 {
530 for (y = 0; y < h; y++)
531 {
532 bs.Write((float)heightmap.get(x, y));
533 }
534 }
535
536 bs.Close();
537 s.Close();
538 }
539
540 /// <summary>
541 /// A very fast LL-RAW file output mechanism - lower precision mechanism but wont take 5 minutes to run either.
542 /// (is also editable in an image application)
543 /// </summary>
544 /// <param name="filename">Filename to write to</param>
545 public void writeToFileRAW(string filename)
546 {
547 FileInfo file = new FileInfo(filename);
548 FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write);
549 BinaryWriter bs = new BinaryWriter(s);
550
551 int x, y;
552
553 // Used for the 'green' channel.
554 byte avgMultiplier = (byte)heightmap.avg();
555 byte backupMultiplier = (byte)revertmap.avg();
556
557 // Limit the multiplier so it can represent points >64m.
558 if (avgMultiplier > 196)
559 avgMultiplier = 196;
560 if(backupMultiplier > 196)
561 backupMultiplier = 196;
562 // Make sure it's at least one to prevent a div by zero
563 if (avgMultiplier < 1)
564 avgMultiplier = 1;
565 if(backupMultiplier < 1)
566 backupMultiplier = 1;
567
568 for (x = 0; x < w; x++)
569 {
570 for (y = 0; y < h; y++)
571 {
572 byte red = (byte)(heightmap.get(x, y) / ((double)avgMultiplier / 128.0));
573 byte green = avgMultiplier;
574 byte blue = (byte)watermap.get(x, y);
575 byte alpha1 = 0; // Land Parcels
576 byte alpha2 = 0; // For Sale Land
577 byte alpha3 = 0; // Public Edit Object
578 byte alpha4 = 0; // Public Edit Land
579 byte alpha5 = 255; // Safe Land
580 byte alpha6 = 255; // Flying Allowed
581 byte alpha7 = 255; // Create Landmark
582 byte alpha8 = 255; // Outside Scripts
583 byte alpha9 = (byte)(revertmap.get(x, y) / ((double)backupMultiplier / 128.0));
584 byte alpha10 = backupMultiplier;
585
586 bs.Write(red);
587 bs.Write(green);
588 bs.Write(blue);
589 bs.Write(alpha1);
590 bs.Write(alpha2);
591 bs.Write(alpha3);
592 bs.Write(alpha4);
593 bs.Write(alpha5);
594 bs.Write(alpha6);
595 bs.Write(alpha7);
596 bs.Write(alpha8);
597 bs.Write(alpha9);
598 bs.Write(alpha10);
599 }
600 }
601 bs.Close();
602 s.Close();
603 }
604
605 /// <summary>
606 /// Outputs to a LL compatible RAW in the most efficient manner possible
607 /// </summary>
608 /// <remarks>Does not calculate the revert map</remarks>
609 /// <param name="filename">The filename to output to</param>
610 public void writeToFileHiRAW(string filename)
611 {
612 FileInfo file = new FileInfo(filename);
613 FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write);
614 BinaryWriter bs = new BinaryWriter(s);
615
616 // Generate a smegging big lookup table to speed the operation up (it needs it)
617 double[] lookupTable = new double[65536];
618 int i, j, x, y;
619 for (i = 0; i < 256; i++)
620 {
621 for (j = 0; j < 256; j++)
622 {
623 lookupTable[i + (j * 256)] = ((double)i * ((double)j / 127.0));
624 }
625 }
626
627 // Output the calculated raw
628 for (x = 0; x < w; x++)
629 {
630 for (y = 0; y < h; y++)
631 {
632 double t = heightmap.get(x, y);
633 double min = double.MaxValue;
634 int index = 0;
635
636 for (i = 0; i < 65536; i++)
637 {
638 if (Math.Abs(t - lookupTable[i]) < min)
639 {
640 min = Math.Abs(t - lookupTable[i]);
641 index = i;
642 }
643 }
644
645 byte red = (byte)(index & 0xFF);
646 byte green = (byte)((index >> 8) & 0xFF);
647 byte blue = (byte)watermap.get(x, y);
648 byte alpha1 = 0; // Land Parcels
649 byte alpha2 = 0; // For Sale Land
650 byte alpha3 = 0; // Public Edit Object
651 byte alpha4 = 0; // Public Edit Land
652 byte alpha5 = 255; // Safe Land
653 byte alpha6 = 255; // Flying Allowed
654 byte alpha7 = 255; // Create Landmark
655 byte alpha8 = 255; // Outside Scripts
656 byte alpha9 = red;
657 byte alpha10 = green;
658
659 bs.Write(red);
660 bs.Write(green);
661 bs.Write(blue);
662 bs.Write(alpha1);
663 bs.Write(alpha2);
664 bs.Write(alpha3);
665 bs.Write(alpha4);
666 bs.Write(alpha5);
667 bs.Write(alpha6);
668 bs.Write(alpha7);
669 bs.Write(alpha8);
670 bs.Write(alpha9);
671 bs.Write(alpha10);
672 }
673 }
674
675 bs.Close();
676 s.Close();
677 }
678
679 /// <summary>
680 /// Sets the random seed to be used by procedural functions which involve random numbers.
681 /// </summary>
682 /// <param name="val">The desired seed</param>
683 public void setSeed(int val)
684 {
685 heightmap.seed = val;
686 }
687
688 /// <summary>
689 /// Raises land in a sphere around the specified coordinates
690 /// </summary>
691 /// <param name="rx">Center of the sphere on the X axis</param>
692 /// <param name="ry">Center of the sphere on the Y axis</param>
693 /// <param name="size">The radius of the sphere</param>
694 /// <param name="amount">Scale the height of the sphere by this amount (recommended 0..2)</param>
695 public void raise(double rx, double ry, double size, double amount)
696 {
697 lock (heightmap)
698 {
699 heightmap.raise(rx, ry, size, amount);
700 }
701
702 tainted++;
703 }
704
705 /// <summary>
706 /// Lowers the land in a sphere around the specified coordinates
707 /// </summary>
708 /// <param name="rx">The center of the sphere at the X axis</param>
709 /// <param name="ry">The center of the sphere at the Y axis</param>
710 /// <param name="size">The radius of the sphere in meters</param>
711 /// <param name="amount">Scale the height of the sphere by this amount (recommended 0..2)</param>
712 public void lower(double rx, double ry, double size, double amount)
713 {
714 lock (heightmap)
715 {
716 heightmap.lower(rx, ry, size, amount);
717 }
718
719 tainted++;
720 }
721
722 /// <summary>
723 /// Flattens the land under the brush of specified coordinates (spherical mask)
724 /// </summary>
725 /// <param name="rx">Center of sphere</param>
726 /// <param name="ry">Center of sphere</param>
727 /// <param name="size">Radius of the sphere</param>
728 /// <param name="amount">Thickness of the mask (0..2 recommended)</param>
729 public void flatten(double rx, double ry, double size, double amount)
730 {
731 lock (heightmap)
732 {
733 heightmap.flatten(rx, ry, size, amount);
734 }
735
736 tainted++;
737 }
738
739 /// <summary>
740 /// Creates noise within the specified bounds
741 /// </summary>
742 /// <param name="rx">Center of the bounding sphere</param>
743 /// <param name="ry">Center of the bounding sphere</param>
744 /// <param name="size">The radius of the sphere</param>
745 /// <param name="amount">Strength of the mask (0..2) recommended</param>
746 public void noise(double rx, double ry, double size, double amount)
747 {
748 lock (heightmap)
749 {
750 Channel smoothed = new Channel();
751 smoothed.noise();
752
753 Channel mask = new Channel();
754 mask.raise(rx, ry, size, amount);
755
756 heightmap.blend(smoothed, mask);
757 }
758
759 tainted++;
760 }
761
762 /// <summary>
763 /// Reverts land within the specified bounds
764 /// </summary>
765 /// <param name="rx">Center of the bounding sphere</param>
766 /// <param name="ry">Center of the bounding sphere</param>
767 /// <param name="size">The radius of the sphere</param>
768 /// <param name="amount">Strength of the mask (0..2) recommended</param>
769 public void revert(double rx, double ry, double size, double amount)
770 {
771 lock (heightmap)
772 {
773 Channel mask = new Channel();
774 mask.raise(rx, ry, size, amount);
775
776 heightmap.blend(revertmap, mask);
777 }
778
779 tainted++;
780 }
781
782 /// <summary>
783 /// Smooths land under the brush of specified coordinates (spherical mask)
784 /// </summary>
785 /// <param name="rx">Center of the sphere</param>
786 /// <param name="ry">Center of the sphere</param>
787 /// <param name="size">Radius of the sphere</param>
788 /// <param name="amount">Thickness of the mask (0..2 recommended)</param>
789 public void smooth(double rx, double ry, double size, double amount)
790 {
791 lock (heightmap)
792 {
793 Channel smoothed = heightmap.copy();
794 smoothed.smooth(amount);
795
796 Channel mask = new Channel();
797 mask.raise(rx,ry,size,amount);
798
799 heightmap.blend(smoothed, mask);
800 }
801
802 tainted++;
803 }
804
805 /// <summary>
806 /// Generates a simple set of hills in the shape of an island
807 /// </summary>
808 public void hills()
809 {
810 lock (heightmap)
811 {
812 heightmap.hillsSpheres(200, 20, 40, true, true, false);
813 heightmap.normalise();
814 heightmap *= 60.0; // Raise to 60m
815 }
816
817 tainted++;
818 }
819
820 /// <summary>
821 /// Wrapper to heightmap.get()
822 /// </summary>
823 /// <param name="x">X coord</param>
824 /// <param name="y">Y coord</param>
825 /// <returns>Height at specified coordinates</returns>
826 public double get(int x, int y)
827 {
828 return heightmap.get(x, y);
829 }
830
831 /// <summary>
832 /// Multiplies the heightfield by val
833 /// </summary>
834 /// <param name="meep">The heightfield</param>
835 /// <param name="val">The multiplier</param>
836 /// <returns></returns>
837 public static TerrainEngine operator *(TerrainEngine meep, Double val)
838 {
839 meep.heightmap *= val;
840 meep.tainted++;
841 return meep;
842 }
843
844 /// <summary>
845 /// Exports the current heightmap to a PNG file
846 /// </summary>
847 /// <param name="filename">The destination filename for the image</param>
848 /// <param name="gradientmap">A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal.</param>
849 public void exportImage(string filename, string gradientmap)
850 {
851 try
852 {
853 Bitmap gradientmapLd = new Bitmap(gradientmap);
854
855 int pallete = gradientmapLd.Height;
856
857 Bitmap bmp = new Bitmap(heightmap.w, heightmap.h);
858 Color[] colours = new Color[pallete];
859
860 for (int i = 0; i < pallete; i++)
861 {
862 colours[i] = gradientmapLd.GetPixel(0, i);
863 }
864
865 Channel copy = heightmap.copy();
866 for (int x = 0; x < copy.w; x++)
867 {
868 for (int y = 0; y < copy.h; y++)
869 {
870 // 512 is the largest possible height before colours clamp
871 int colorindex = (int)(Math.Max(Math.Min(1.0, copy.get(x, y) / 512.0), 0.0) * pallete);
872 bmp.SetPixel(x, y, colours[colorindex]);
873 }
874 }
875
876 bmp.Save(filename, ImageFormat.Png);
877 }
878 catch (Exception e)
879 {
880 Console.WriteLine("Failed generating terrain map: " + e.ToString());
881 }
882 }
883
884 /// <summary>
885 /// Exports the current heightmap in Jpeg2000 format to a byte[]
886 /// </summary>
887 /// <param name="gradientmap">A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal.</param>
888 public byte[] exportJpegImage(string gradientmap)
889 {
890 byte[] imageData = null;
891 try
892 {
893 Bitmap gradientmapLd = new Bitmap(gradientmap);
894
895 int pallete = gradientmapLd.Height;
896
897 Bitmap bmp = new Bitmap(heightmap.w, heightmap.h);
898 Color[] colours = new Color[pallete];
899
900 for (int i = 0; i < pallete; i++)
901 {
902 colours[i] = gradientmapLd.GetPixel(0, i);
903 }
904
905 Channel copy = heightmap.copy();
906 for (int x = 0; x < copy.w; x++)
907 {
908 for (int y = 0; y < copy.h; y++)
909 {
910 // 512 is the largest possible height before colours clamp
911 int colorindex = (int)(Math.Max(Math.Min(1.0, copy.get(copy.h - y, x) / 512.0), 0.0) * pallete);
912 bmp.SetPixel(x, y, colours[colorindex]);
913 }
914 }
915
916 //bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
917 imageData = OpenJPEG.EncodeFromImage(bmp, "map");
918
919 }
920 catch (Exception e)
921 {
922 Console.WriteLine("Failed generating terrain map: " + e.ToString());
923 }
924
925 return imageData;
926 }
927 }
928} \ 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..a38be07
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs
@@ -0,0 +1,126 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.CodeDom.Compiler;
30using System.Collections.Generic;
31using libTerrain;
32using Microsoft.CSharp;
33using Microsoft.JScript;
34
35namespace OpenSim.Region.Terrain
36{
37 public interface ITerrainFilter
38 {
39 void Filter(Channel heightmap, string[] args);
40 string Register();
41 string Help();
42 }
43
44 public class TestFilter : ITerrainFilter
45 {
46 public void Filter(Channel heightmap, string[] args)
47 {
48 Console.WriteLine("Hello world");
49 }
50
51 public string Register()
52 {
53 return "demofilter";
54 }
55
56 public string Help()
57 {
58 return "demofilter - Does nothing";
59 }
60 }
61
62 public class FilterHost
63 {
64 public Dictionary<string, ITerrainFilter> filters = new Dictionary<string, ITerrainFilter>();
65
66 private void LoadFilter(CodeDomProvider compiler, string filename)
67 {
68 CompilerParameters compilerParams = new CompilerParameters();
69 CompilerResults compilerResults;
70 compilerParams.GenerateExecutable = false;
71 compilerParams.GenerateInMemory = true;
72 compilerParams.IncludeDebugInformation = false;
73 compilerParams.ReferencedAssemblies.Add("libTerrain-BSD.dll");
74 compilerParams.ReferencedAssemblies.Add("OpenSim.Terrain.BasicTerrain.dll");
75 compilerParams.ReferencedAssemblies.Add("System.dll");
76
77 compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename);
78
79 if (compilerResults.Errors.Count > 0)
80 {
81 Console.WriteLine("Compile errors:");
82 foreach (CompilerError error in compilerResults.Errors)
83 {
84 Console.WriteLine(error.Line.ToString() + ": " + error.ErrorText.ToString());
85 }
86 }
87 else
88 {
89 foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes())
90 {
91 Type testInterface = pluginType.GetInterface("ITerrainFilter",true);
92
93 if (testInterface != null)
94 {
95 ITerrainFilter filter = (ITerrainFilter)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString());
96
97 string filterName = filter.Register();
98 Console.WriteLine("Plugin: " + filterName + " loaded.");
99
100 if (!filters.ContainsKey(filterName))
101 {
102 filters.Add(filterName, filter);
103 }
104 else
105 {
106 filters[filterName] = filter;
107 }
108 }
109 }
110 }
111
112 }
113
114 public void LoadFilterCSharp(string filename)
115 {
116 CSharpCodeProvider compiler = new CSharpCodeProvider();
117 LoadFilter(compiler, filename);
118 }
119
120 public void LoadFilterJScript(string filename)
121 {
122 JScriptCodeProvider compiler = new JScriptCodeProvider();
123 LoadFilter(compiler, filename);
124 }
125 }
126}