aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Simulation
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Simulation')
-rw-r--r--OpenSim/Region/Simulation/Caps.cs258
-rw-r--r--OpenSim/Region/Simulation/EstateManager.cs301
-rw-r--r--OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj211
-rw-r--r--OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user12
-rw-r--r--OpenSim/Region/Simulation/ParcelManager.cs892
-rw-r--r--OpenSim/Region/Simulation/RegionManager.cs30
-rw-r--r--OpenSim/Region/Simulation/Scenes/Entity.cs194
-rw-r--r--OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs19
-rw-r--r--OpenSim/Region/Simulation/Scenes/Primitive.cs582
-rw-r--r--OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs305
-rw-r--r--OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs184
-rw-r--r--OpenSim/Region/Simulation/Scenes/Scene.cs795
-rw-r--r--OpenSim/Region/Simulation/Scenes/SceneBase.cs201
-rw-r--r--OpenSim/Region/Simulation/Scenes/SceneEvents.cs52
-rw-r--r--OpenSim/Region/Simulation/Scenes/SceneObject.cs128
-rw-r--r--OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs76
-rw-r--r--OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs90
-rw-r--r--OpenSim/Region/Simulation/Scenes/ScenePresence.cs525
-rw-r--r--OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs40
-rw-r--r--OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs46
-rw-r--r--OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs126
-rw-r--r--OpenSim/Region/Simulation/Scenes/scripting/Script.cs53
-rw-r--r--OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs35
-rw-r--r--OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs64
24 files changed, 5219 insertions, 0 deletions
diff --git a/OpenSim/Region/Simulation/Caps.cs b/OpenSim/Region/Simulation/Caps.cs
new file mode 100644
index 0000000..13a351d
--- /dev/null
+++ b/OpenSim/Region/Simulation/Caps.cs
@@ -0,0 +1,258 @@
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Text;
5using System.IO;
6using System.Xml;
7using OpenSim.Servers;
8using OpenSim.Framework;
9using OpenSim.Framework.Utilities;
10using OpenSim.Framework.Types;
11using OpenSim.Caches;
12using libsecondlife;
13
14namespace OpenSim.Region
15{
16 public delegate void UpLoadedTexture(LLUUID assetID, LLUUID inventoryItem, byte[] data);
17
18 public class Caps
19 {
20 private string httpListenerAddress;
21 private uint httpListenPort;
22 private string capsObjectPath = "00001-";
23 private string requestPath = "0000/";
24 private string mapLayerPath = "0001/";
25 private string newInventory = "0002/";
26 private string requestTexture = "0003/";
27 private string eventQueue = "0100/";
28 private BaseHttpServer httpListener;
29 private LLUUID agentID;
30 private AssetCache assetCache;
31 private int eventQueueCount = 1;
32 private Queue<string> CapsEventQueue = new Queue<string>();
33
34 public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath, LLUUID agent)
35 {
36 assetCache = assetCach;
37 capsObjectPath = capsPath;
38 httpListener = httpServer;
39 httpListenerAddress = httpListen;
40 httpListenPort = httpPort;
41 agentID = agent;
42 }
43
44 /// <summary>
45 ///
46 /// </summary>
47 public void RegisterHandlers()
48 {
49 Console.WriteLine("registering CAPS handlers");
50 httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + requestPath, CapsRequest);
51 httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + mapLayerPath, MapLayer);
52 httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + newInventory, NewAgentInventory);
53 httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + eventQueue, ProcessEventQueue);
54 }
55
56 /// <summary>
57 ///
58 /// </summary>
59 /// <param name="request"></param>
60 /// <param name="path"></param>
61 /// <param name="param"></param>
62 /// <returns></returns>
63 public string CapsRequest(string request, string path, string param)
64 {
65 // Console.WriteLine("Caps Request " + request);
66 string result = "";
67 result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities());
68 return result;
69 }
70
71 /// <summary>
72 ///
73 /// </summary>
74 /// <returns></returns>
75 protected LLSDCapsDetails GetCapabilities()
76 {
77 /* string capURLS = "";
78 capURLS += "<key>MapLayer</key><string>http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + mapLayerPath + "</string>";
79 capURLS += "<key>NewFileAgentInventory</key><string>http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + newInventory + "</string>";
80 //capURLS += "<key>RequestTextureDownload</key><string>http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + requestTexture + "</string>";
81 //capURLS += "<key>EventQueueGet</key><string>http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + eventQueue + "</string>";
82 return capURLS;*/
83
84 LLSDCapsDetails caps = new LLSDCapsDetails();
85 caps.MapLayer = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + mapLayerPath;
86 caps.NewFileAgentInventory = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + newInventory;
87 return caps;
88 }
89
90 /// <summary>
91 ///
92 /// </summary>
93 /// <param name="request"></param>
94 /// <param name="path"></param>
95 /// <param name="param"></param>
96 /// <returns></returns>
97 public string MapLayer(string request, string path, string param)
98 {
99 Encoding _enc = System.Text.Encoding.UTF8;
100 Hashtable hash =(Hashtable) LLSD.LLSDDeserialize(_enc.GetBytes(request));
101 LLSDMapRequest mapReq = new LLSDMapRequest();
102 LLSDHelpers.DeserialiseLLSDMap(hash, mapReq );
103
104 LLSDMapLayerResponse mapResponse= new LLSDMapLayerResponse();
105 mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse());
106 string res = LLSDHelpers.SerialiseLLSDReply(mapResponse);
107
108 //Console.WriteLine(" Maplayer response is " + res);
109
110 return res;
111 }
112
113 /// <summary>
114 ///
115 /// </summary>
116 /// <returns></returns>
117 protected LLSDMapLayer BuildLLSDMapLayerResponse()
118 {
119 LLSDMapLayer mapLayer = new LLSDMapLayer();
120 mapLayer.Right = 5000;
121 mapLayer.Top = 5000;
122 mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
123
124 return mapLayer;
125 }
126
127 public string ProcessEventQueue(string request, string path, string param)
128 {
129 // Console.WriteLine("event queue request " + request);
130 string res = "";
131 int timer = 0;
132
133 /*while ((timer < 200) || (this.CapsEventQueue.Count < 1))
134 {
135 timer++;
136 }*/
137 if (this.CapsEventQueue.Count > 0)
138 {
139 lock (this.CapsEventQueue)
140 {
141 string item = CapsEventQueue.Dequeue();
142 res = item;
143 }
144 }
145 else
146 {
147 res = this.CreateEmptyEventResponse();
148 }
149 return res;
150 }
151
152 public string CreateEstablishAgentComms(string caps, string ipAddressPort)
153 {
154 string res = "<llsd><map><key>id</key><integer>" + eventQueueCount + "</integer>";
155 res += "<key>events</key><array><map>";
156 res += "<key>message</key><string>EstablishAgentCommunication</string>";
157 res += "<key>body</key><map>";
158 res += "<key>sim-ip-and-port</key><string>" + ipAddressPort + "</string>";
159 res += "<key>seed-capability</key><string>" + caps + "</string>";
160 res += "<key>agent-id</key><uuid>" + this.agentID.ToStringHyphenated() + "</uuid>";
161 res += "</map>";
162 res += "</map></array>";
163 res += "</map></llsd>";
164 eventQueueCount++;
165 this.CapsEventQueue.Enqueue(res);
166 return res;
167 }
168
169 public string CreateEmptyEventResponse()
170 {
171 string res = "<llsd><map><key>id</key><integer>" + eventQueueCount + "</integer>";
172 res += "<key>events</key><array><map>";
173 res += "</map></array>";
174 res += "</map></llsd>";
175 eventQueueCount++;
176 return res;
177 }
178
179 public string NewAgentInventory(string request, string path, string param)
180 {
181 //Console.WriteLine("received upload request:"+ request);
182 string res = "";
183 LLUUID newAsset = LLUUID.Random();
184 LLUUID newInvItem = LLUUID.Random();
185 string uploaderPath = capsObjectPath + Util.RandomClass.Next(5000, 8000).ToString("0000");
186 AssetUploader uploader = new AssetUploader(newAsset, newInvItem, uploaderPath, this.httpListener);
187 httpListener.AddRestHandler("POST", "/CAPS/" + uploaderPath, uploader.uploaderCaps);
188 string uploaderURL = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + uploaderPath;
189 //Console.WriteLine("uploader url is " + uploaderURL);
190 res += "<llsd><map>";
191 res += "<key>uploader</key><string>" + uploaderURL + "</string>";
192 //res += "<key>success</key><boolean>true</boolean>";
193 res += "<key>state</key><string>upload</string>";
194 res += "</map></llsd>";
195 uploader.OnUpLoad += this.UploadHandler;
196 return res;
197 }
198
199 public void UploadHandler(LLUUID assetID, LLUUID inventoryItem, byte[] data)
200 {
201 // Console.WriteLine("upload handler called");
202 AssetBase asset;
203 asset = new AssetBase();
204 asset.FullID = assetID;
205 asset.Type = 0;
206 asset.InvType = 0;
207 asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000");
208 asset.Data = data;
209 this.assetCache.AddAsset(asset);
210 }
211
212 public class AssetUploader
213 {
214 public event UpLoadedTexture OnUpLoad;
215
216 private string uploaderPath = "";
217 private LLUUID newAssetID;
218 private LLUUID inventoryItemID;
219 private BaseHttpServer httpListener;
220 public AssetUploader(LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer)
221 {
222 newAssetID = assetID;
223 inventoryItemID = inventoryItem;
224 uploaderPath = path;
225 httpListener = httpServer;
226
227 }
228
229 public string uploaderCaps(string request, string path, string param)
230 {
231 Encoding _enc = System.Text.Encoding.UTF8;
232 byte[] data = _enc.GetBytes(request);
233 //Console.WriteLine("recieved upload " + Util.FieldToString(data));
234 LLUUID inv = this.inventoryItemID;
235 string res = "";
236 res += "<llsd><map>";
237 res += "<key>new_asset</key><string>" + newAssetID.ToStringHyphenated() + "</string>";
238 res += "<key>new_inventory_item</key><uuid>" + inv.ToStringHyphenated() + "</uuid>";
239 res += "<key>state</key><string>complete</string>";
240 res += "</map></llsd>";
241
242 // Console.WriteLine("asset " + newAssetID.ToStringHyphenated() + " , inventory item " + inv.ToStringHyphenated());
243 httpListener.RemoveRestHandler("POST", "/CAPS/" + uploaderPath);
244 if (OnUpLoad != null)
245 {
246 OnUpLoad(newAssetID, inv, data);
247 }
248
249 /*FileStream fs = File.Create("upload.jp2");
250 BinaryWriter bw = new BinaryWriter(fs);
251 bw.Write(data);
252 bw.Close();
253 fs.Close();*/
254 return res;
255 }
256 }
257 }
258}
diff --git a/OpenSim/Region/Simulation/EstateManager.cs b/OpenSim/Region/Simulation/EstateManager.cs
new file mode 100644
index 0000000..dcb5564
--- /dev/null
+++ b/OpenSim/Region/Simulation/EstateManager.cs
@@ -0,0 +1,301 @@
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.Framework.Types;
32using OpenSim.Framework.Interfaces;
33using OpenSim.Region;
34using OpenSim.Region.Scenes;
35using OpenSim;
36using libsecondlife;
37using libsecondlife.Packets;
38using Avatar = OpenSim.Region.Scenes.ScenePresence;
39
40
41namespace OpenSim.Region
42{
43
44 /// <summary>
45 /// Processes requests regarding estates. Refer to EstateSettings.cs in OpenSim.Framework. Types for all of the core settings
46 /// </summary>
47 public class EstateManager
48 {
49 private Scene m_world;
50 private RegionInfo m_regInfo;
51
52 public EstateManager(Scene world,RegionInfo reginfo)
53 {
54 m_world = world; //Estate settings found at world.m_regInfo.estateSettings
55 m_regInfo = reginfo;
56 }
57
58 private bool convertParamStringToBool(byte[] field)
59 {
60 string s = Helpers.FieldToUTF8String(field);
61 if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
62 {
63 return true;
64 }
65 return false;
66 }
67
68 public void handleEstateOwnerMessage(EstateOwnerMessagePacket packet, IClientAPI remote_client)
69 {
70 if (remote_client.AgentId == m_regInfo.MasterAvatarAssignedUUID)
71 {
72 switch (Helpers.FieldToUTF8String(packet.MethodData.Method))
73 {
74 case "getinfo":
75 Console.WriteLine("GETINFO Requested");
76 this.sendRegionInfoPacketToAll();
77
78 break;
79 case "setregioninfo":
80 if (packet.ParamList.Length != 9)
81 {
82 OpenSim.Framework.Console.MainLog.Instance.Error("EstateOwnerMessage: SetRegionInfo method has a ParamList of invalid length");
83 }
84 else
85 {
86 m_regInfo.estateSettings.regionFlags = libsecondlife.Simulator.RegionFlags.None;
87
88 if (convertParamStringToBool(packet.ParamList[0].Parameter))
89 {
90 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.BlockTerraform;
91 }
92
93 if (convertParamStringToBool(packet.ParamList[1].Parameter))
94 {
95 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.NoFly;
96 }
97
98 if (convertParamStringToBool(packet.ParamList[2].Parameter))
99 {
100 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.AllowDamage;
101 }
102
103 if (convertParamStringToBool(packet.ParamList[3].Parameter) == false)
104 {
105 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.BlockLandResell;
106 }
107
108
109 int tempMaxAgents = Convert.ToInt16(Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[4].Parameter)));
110 m_regInfo.estateSettings.maxAgents = (byte)tempMaxAgents;
111
112 float tempObjectBonusFactor = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter));
113 m_regInfo.estateSettings.objectBonusFactor = tempObjectBonusFactor;
114
115 int tempMatureLevel = Convert.ToInt16(Helpers.FieldToUTF8String(packet.ParamList[6].Parameter));
116 m_regInfo.estateSettings.simAccess = (libsecondlife.Simulator.SimAccess)tempMatureLevel;
117
118
119 if (convertParamStringToBool(packet.ParamList[7].Parameter))
120 {
121 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.RestrictPushObject;
122 }
123
124 if (convertParamStringToBool(packet.ParamList[8].Parameter))
125 {
126 m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.AllowParcelChanges;
127 }
128
129 sendRegionInfoPacketToAll();
130
131 }
132 break;
133 case "texturebase":
134 foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
135 {
136 string s = Helpers.FieldToUTF8String(block.Parameter);
137 string[] splitField = s.Split(' ');
138 if (splitField.Length == 2)
139 {
140 LLUUID tempUUID = new LLUUID(splitField[1]);
141 switch (Convert.ToInt16(splitField[0]))
142 {
143 case 0:
144 m_regInfo.estateSettings.terrainBase0 = tempUUID;
145 break;
146 case 1:
147 m_regInfo.estateSettings.terrainBase1 = tempUUID;
148 break;
149 case 2:
150 m_regInfo.estateSettings.terrainBase2 = tempUUID;
151 break;
152 case 3:
153 m_regInfo.estateSettings.terrainBase3 = tempUUID;
154 break;
155 }
156 }
157 }
158 break;
159 case "texturedetail":
160 foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
161 {
162
163 string s = Helpers.FieldToUTF8String(block.Parameter);
164 string[] splitField = s.Split(' ');
165 if (splitField.Length == 2)
166 {
167 LLUUID tempUUID = new LLUUID(splitField[1]);
168 switch (Convert.ToInt16(splitField[0]))
169 {
170 case 0:
171 m_regInfo.estateSettings.terrainDetail0 = tempUUID;
172 break;
173 case 1:
174 m_regInfo.estateSettings.terrainDetail1 = tempUUID;
175 break;
176 case 2:
177 m_regInfo.estateSettings.terrainDetail2 = tempUUID;
178 break;
179 case 3:
180 m_regInfo.estateSettings.terrainDetail3 = tempUUID;
181 break;
182 }
183 }
184 }
185 break;
186 case "textureheights":
187 foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
188 {
189
190 string s = Helpers.FieldToUTF8String(block.Parameter);
191 string[] splitField = s.Split(' ');
192 if (splitField.Length == 3)
193 {
194
195 float tempHeightLow = (float)Convert.ToDecimal(splitField[1]);
196 float tempHeightHigh = (float)Convert.ToDecimal(splitField[2]);
197
198 switch (Convert.ToInt16(splitField[0]))
199 {
200 case 0:
201 m_regInfo.estateSettings.terrainStartHeight0 = tempHeightLow;
202 m_regInfo.estateSettings.terrainHeightRange0 = tempHeightHigh;
203 break;
204 case 1:
205 m_regInfo.estateSettings.terrainStartHeight1 = tempHeightLow;
206 m_regInfo.estateSettings.terrainHeightRange1 = tempHeightHigh;
207 break;
208 case 2:
209 m_regInfo.estateSettings.terrainStartHeight2 = tempHeightLow;
210 m_regInfo.estateSettings.terrainHeightRange2 = tempHeightHigh;
211 break;
212 case 3:
213 m_regInfo.estateSettings.terrainStartHeight3 = tempHeightLow;
214 m_regInfo.estateSettings.terrainHeightRange3 = tempHeightHigh;
215 break;
216 }
217 }
218 }
219 break;
220 case "texturecommit":
221 sendRegionHandshakeToAll();
222 break;
223 case "setregionterrain":
224 if (packet.ParamList.Length != 9)
225 {
226 OpenSim.Framework.Console.MainLog.Instance.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
227 }
228 else
229 {
230 m_regInfo.estateSettings.waterHeight = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[0].Parameter));
231 m_regInfo.estateSettings.terrainRaiseLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[1].Parameter));
232 m_regInfo.estateSettings.terrainLowerLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[2].Parameter));
233 m_regInfo.estateSettings.useFixedSun = this.convertParamStringToBool(packet.ParamList[4].Parameter);
234 m_regInfo.estateSettings.sunHour = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter));
235
236 sendRegionInfoPacketToAll();
237 }
238 break;
239 default:
240 OpenSim.Framework.Console.MainLog.Instance.Error("EstateOwnerMessage: Unknown method requested\n" + packet.ToString());
241 break;
242 }
243 }
244 }
245
246 public void sendRegionInfoPacketToAll()
247 {
248 List<Avatar> avatars = m_world.RequestAvatarList();
249
250 for (int i = 0; i < avatars.Count; i++)
251 {
252 this.sendRegionInfoPacket(avatars[i].ControllingClient);
253 }
254 }
255
256 public void sendRegionHandshakeToAll()
257 {
258 List<Avatar> avatars = m_world.RequestAvatarList();
259
260 for (int i = 0; i < avatars.Count; i++)
261 {
262 this.sendRegionHandshake(avatars[i].ControllingClient);
263 }
264 }
265
266 public void sendRegionInfoPacket(IClientAPI remote_client)
267 {
268 Encoding _enc = System.Text.Encoding.ASCII;
269
270 AgentCircuitData circuitData = remote_client.RequestClientInfo();
271
272 RegionInfoPacket regionInfoPacket = new RegionInfoPacket();
273 regionInfoPacket.AgentData.AgentID = circuitData.AgentID;
274 regionInfoPacket.AgentData.SessionID = circuitData.SessionID;
275 regionInfoPacket.RegionInfo.BillableFactor = m_regInfo.estateSettings.billableFactor;
276 regionInfoPacket.RegionInfo.EstateID = m_regInfo.estateSettings.estateID;
277 regionInfoPacket.RegionInfo.MaxAgents = m_regInfo.estateSettings.maxAgents;
278 regionInfoPacket.RegionInfo.ObjectBonusFactor = m_regInfo.estateSettings.objectBonusFactor;
279 regionInfoPacket.RegionInfo.ParentEstateID = m_regInfo.estateSettings.parentEstateID;
280 regionInfoPacket.RegionInfo.PricePerMeter = m_regInfo.estateSettings.pricePerMeter;
281 regionInfoPacket.RegionInfo.RedirectGridX = m_regInfo.estateSettings.redirectGridX;
282 regionInfoPacket.RegionInfo.RedirectGridY = m_regInfo.estateSettings.redirectGridY;
283 regionInfoPacket.RegionInfo.RegionFlags = (uint)m_regInfo.estateSettings.regionFlags;
284 regionInfoPacket.RegionInfo.SimAccess = (byte)m_regInfo.estateSettings.simAccess;
285 regionInfoPacket.RegionInfo.SimName = _enc.GetBytes( m_regInfo.RegionName);
286 regionInfoPacket.RegionInfo.SunHour = m_regInfo.estateSettings.sunHour;
287 regionInfoPacket.RegionInfo.TerrainLowerLimit = m_regInfo.estateSettings.terrainLowerLimit;
288 regionInfoPacket.RegionInfo.TerrainRaiseLimit = m_regInfo.estateSettings.terrainRaiseLimit;
289 regionInfoPacket.RegionInfo.UseEstateSun = !m_regInfo.estateSettings.useFixedSun;
290 regionInfoPacket.RegionInfo.WaterHeight = m_regInfo.estateSettings.waterHeight;
291
292 remote_client.OutPacket(regionInfoPacket);
293 }
294
295 public void sendRegionHandshake(IClientAPI remoteClient)
296 {
297 remoteClient.SendRegionHandshake(m_regInfo);
298 }
299
300 }
301}
diff --git a/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj
new file mode 100644
index 0000000..7811a55
--- /dev/null
+++ b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj
@@ -0,0 +1,211 @@
1<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2 <PropertyGroup>
3 <ProjectType>Local</ProjectType>
4 <ProductVersion>8.0.50727</ProductVersion>
5 <SchemaVersion>2.0</SchemaVersion>
6 <ProjectGuid>{C0DAB338-0000-0000-0000-000000000000}</ProjectGuid>
7 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
8 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
9 <ApplicationIcon></ApplicationIcon>
10 <AssemblyKeyContainerName>
11 </AssemblyKeyContainerName>
12 <AssemblyName>OpenSim.Region.Simulation</AssemblyName>
13 <DefaultClientScript>JScript</DefaultClientScript>
14 <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
15 <DefaultTargetSchema>IE50</DefaultTargetSchema>
16 <DelaySign>false</DelaySign>
17 <OutputType>Library</OutputType>
18 <AppDesignerFolder></AppDesignerFolder>
19 <RootNamespace>OpenSim.Region.Simulation</RootNamespace>
20 <StartupObject></StartupObject>
21 <FileUpgradeFlags>
22 </FileUpgradeFlags>
23 </PropertyGroup>
24 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
25 <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
26 <BaseAddress>285212672</BaseAddress>
27 <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
28 <ConfigurationOverrideFile>
29 </ConfigurationOverrideFile>
30 <DefineConstants>TRACE;DEBUG</DefineConstants>
31 <DocumentationFile></DocumentationFile>
32 <DebugSymbols>True</DebugSymbols>
33 <FileAlignment>4096</FileAlignment>
34 <Optimize>False</Optimize>
35 <OutputPath>..\..\..\bin\</OutputPath>
36 <RegisterForComInterop>False</RegisterForComInterop>
37 <RemoveIntegerChecks>False</RemoveIntegerChecks>
38 <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
39 <WarningLevel>4</WarningLevel>
40 <NoWarn></NoWarn>
41 </PropertyGroup>
42 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
43 <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
44 <BaseAddress>285212672</BaseAddress>
45 <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
46 <ConfigurationOverrideFile>
47 </ConfigurationOverrideFile>
48 <DefineConstants>TRACE</DefineConstants>
49 <DocumentationFile></DocumentationFile>
50 <DebugSymbols>False</DebugSymbols>
51 <FileAlignment>4096</FileAlignment>
52 <Optimize>True</Optimize>
53 <OutputPath>..\..\..\bin\</OutputPath>
54 <RegisterForComInterop>False</RegisterForComInterop>
55 <RemoveIntegerChecks>False</RemoveIntegerChecks>
56 <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
57 <WarningLevel>4</WarningLevel>
58 <NoWarn></NoWarn>
59 </PropertyGroup>
60 <ItemGroup>
61 <Reference Include="Axiom.MathLib.dll" >
62 <HintPath>..\..\..\bin\Axiom.MathLib.dll</HintPath>
63 <Private>False</Private>
64 </Reference>
65 <Reference Include="Db4objects.Db4o.dll" >
66 <HintPath>..\..\..\bin\Db4objects.Db4o.dll</HintPath>
67 <Private>False</Private>
68 </Reference>
69 <Reference Include="libsecondlife.dll" >
70 <HintPath>..\..\..\bin\libsecondlife.dll</HintPath>
71 <Private>False</Private>
72 </Reference>
73 <Reference Include="System" >
74 <HintPath>System.dll</HintPath>
75 <Private>False</Private>
76 </Reference>
77 <Reference Include="System.Xml" >
78 <HintPath>System.Xml.dll</HintPath>
79 <Private>False</Private>
80 </Reference>
81 <Reference Include="XMLRPC.dll" >
82 <HintPath>..\..\..\bin\XMLRPC.dll</HintPath>
83 <Private>False</Private>
84 </Reference>
85 </ItemGroup>
86 <ItemGroup>
87 <ProjectReference Include="..\..\Framework\General\OpenSim.Framework.csproj">
88 <Name>OpenSim.Framework</Name>
89 <Project>{8ACA2445-0000-0000-0000-000000000000}</Project>
90 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
91 <Private>False</Private>
92 </ProjectReference>
93 <ProjectReference Include="..\..\Framework\Communications\OpenSim.Framework.Communications.csproj">
94 <Name>OpenSim.Framework.Communications</Name>
95 <Project>{CB52B7E7-0000-0000-0000-000000000000}</Project>
96 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
97 <Private>False</Private>
98 </ProjectReference>
99 <ProjectReference Include="..\..\Framework\Console\OpenSim.Framework.Console.csproj">
100 <Name>OpenSim.Framework.Console</Name>
101 <Project>{A7CD0630-0000-0000-0000-000000000000}</Project>
102 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
103 <Private>False</Private>
104 </ProjectReference>
105 <ProjectReference Include="..\..\Framework\GenericConfig\Xml\OpenSim.Framework.GenericConfig.Xml.csproj">
106 <Name>OpenSim.Framework.GenericConfig.Xml</Name>
107 <Project>{C74E4A30-0000-0000-0000-000000000000}</Project>
108 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
109 <Private>False</Private>
110 </ProjectReference>
111 <ProjectReference Include="..\..\Framework\Servers\OpenSim.Framework.Servers.csproj">
112 <Name>OpenSim.Framework.Servers</Name>
113 <Project>{2CC71860-0000-0000-0000-000000000000}</Project>
114 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
115 <Private>False</Private>
116 </ProjectReference>
117 <ProjectReference Include="..\Caches\OpenSim.Region.Caches.csproj">
118 <Name>OpenSim.Region.Caches</Name>
119 <Project>{61FCCDB3-0000-0000-0000-000000000000}</Project>
120 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
121 <Private>False</Private>
122 </ProjectReference>
123 <ProjectReference Include="..\Physics\Manager\OpenSim.Region.Physics.Manager.csproj">
124 <Name>OpenSim.Region.Physics.Manager</Name>
125 <Project>{F4FF31EB-0000-0000-0000-000000000000}</Project>
126 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
127 <Private>False</Private>
128 </ProjectReference>
129 <ProjectReference Include="..\Terrain.BasicTerrain\OpenSim.Region.Terrain.BasicTerrain.csproj">
130 <Name>OpenSim.Region.Terrain.BasicTerrain</Name>
131 <Project>{C9E0F891-0000-0000-0000-000000000000}</Project>
132 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
133 <Private>False</Private>
134 </ProjectReference>
135 </ItemGroup>
136 <ItemGroup>
137 <Compile Include="Caps.cs">
138 <SubType>Code</SubType>
139 </Compile>
140 <Compile Include="EstateManager.cs">
141 <SubType>Code</SubType>
142 </Compile>
143 <Compile Include="ParcelManager.cs">
144 <SubType>Code</SubType>
145 </Compile>
146 <Compile Include="RegionManager.cs">
147 <SubType>Code</SubType>
148 </Compile>
149 <Compile Include="Scenes\Entity.cs">
150 <SubType>Code</SubType>
151 </Compile>
152 <Compile Include="Scenes\IScenePresenceBody.cs">
153 <SubType>Code</SubType>
154 </Compile>
155 <Compile Include="Scenes\Primitive.cs">
156 <SubType>Code</SubType>
157 </Compile>
158 <Compile Include="Scenes\Scene.cs">
159 <SubType>Code</SubType>
160 </Compile>
161 <Compile Include="Scenes\Scene.PacketHandlers.cs">
162 <SubType>Code</SubType>
163 </Compile>
164 <Compile Include="Scenes\Scene.Scripting.cs">
165 <SubType>Code</SubType>
166 </Compile>
167 <Compile Include="Scenes\SceneBase.cs">
168 <SubType>Code</SubType>
169 </Compile>
170 <Compile Include="Scenes\SceneEvents.cs">
171 <SubType>Code</SubType>
172 </Compile>
173 <Compile Include="Scenes\SceneObject.cs">
174 <SubType>Code</SubType>
175 </Compile>
176 <Compile Include="Scenes\ScenePresence.Animations.cs">
177 <SubType>Code</SubType>
178 </Compile>
179 <Compile Include="Scenes\ScenePresence.Body.cs">
180 <SubType>Code</SubType>
181 </Compile>
182 <Compile Include="Scenes\ScenePresence.cs">
183 <SubType>Code</SubType>
184 </Compile>
185 <Compile Include="Scenes\scripting\IScriptContext.cs">
186 <SubType>Code</SubType>
187 </Compile>
188 <Compile Include="Scenes\scripting\IScriptEntity.cs">
189 <SubType>Code</SubType>
190 </Compile>
191 <Compile Include="Scenes\scripting\IScriptHandler.cs">
192 <SubType>Code</SubType>
193 </Compile>
194 <Compile Include="Scenes\scripting\Script.cs">
195 <SubType>Code</SubType>
196 </Compile>
197 <Compile Include="Scenes\scripting\ScriptFactory.cs">
198 <SubType>Code</SubType>
199 </Compile>
200 <Compile Include="Scenes\scripting\Scripts\FollowRandomAvatar.cs">
201 <SubType>Code</SubType>
202 </Compile>
203 </ItemGroup>
204 <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
205 <PropertyGroup>
206 <PreBuildEvent>
207 </PreBuildEvent>
208 <PostBuildEvent>
209 </PostBuildEvent>
210 </PropertyGroup>
211</Project>
diff --git a/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user
@@ -0,0 +1,12 @@
1<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2 <PropertyGroup>
3 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
4 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
5 <ReferencePath>C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\</ReferencePath>
6 <LastOpenVersion>8.0.50727</LastOpenVersion>
7 <ProjectView>ProjectFiles</ProjectView>
8 <ProjectTrust>0</ProjectTrust>
9 </PropertyGroup>
10 <PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " />
11 <PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />
12</Project>
diff --git a/OpenSim/Region/Simulation/ParcelManager.cs b/OpenSim/Region/Simulation/ParcelManager.cs
new file mode 100644
index 0000000..d15d77d
--- /dev/null
+++ b/OpenSim/Region/Simulation/ParcelManager.cs
@@ -0,0 +1,892 @@
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.Interfaces;
34using OpenSim.Framework.Types;
35using OpenSim.Region.Scenes;
36using Avatar = OpenSim.Region.Scenes.ScenePresence;
37
38namespace OpenSim.Region
39{
40
41
42 #region ParcelManager Class
43 /// <summary>
44 /// Handles Parcel objects and operations requiring information from other Parcel objects (divide, join, etc)
45 /// </summary>
46 public class ParcelManager : OpenSim.Framework.Interfaces.ILocalStorageParcelReceiver
47 {
48
49 #region Constants
50 //Parcel types set with flags in ParcelOverlay.
51 //Only one of these can be used.
52 public const byte PARCEL_TYPE_PUBLIC = (byte)0; //Equals 00000000
53 public const byte PARCEL_TYPE_OWNED_BY_OTHER = (byte)1; //Equals 00000001
54 public const byte PARCEL_TYPE_OWNED_BY_GROUP = (byte)2; //Equals 00000010
55 public const byte PARCEL_TYPE_OWNED_BY_REQUESTER = (byte)3; //Equals 00000011
56 public const byte PARCEL_TYPE_IS_FOR_SALE = (byte)4; //Equals 00000100
57 public const byte PARCEL_TYPE_IS_BEING_AUCTIONED = (byte)5; //Equals 00000101
58
59
60 //Flags that when set, a border on the given side will be placed
61 //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)
62 //This took forever to figure out -- jeesh. /blame LL for even having to send these
63 public const byte PARCEL_FLAG_PROPERTY_BORDER_WEST = (byte)64; //Equals 01000000
64 public const byte PARCEL_FLAG_PROPERTY_BORDER_SOUTH = (byte)128; //Equals 10000000
65
66 //RequestResults (I think these are right, they seem to work):
67 public const int PARCEL_RESULT_ONE_PARCEL = 0; // The request they made contained only one parcel
68 public const int PARCEL_RESULT_MULTIPLE_PARCELS = 1; // The request they made contained more than one parcel
69
70 //These are other constants. Yay!
71 public const int START_PARCEL_LOCAL_ID = 1;
72 #endregion
73
74 #region Member Variables
75 public Dictionary<int, Parcel> parcelList = new Dictionary<int, Parcel>();
76 private int lastParcelLocalID = START_PARCEL_LOCAL_ID - 1;
77 private int[,] parcelIDList = new int[64, 64];
78
79 private Scene m_world;
80 private RegionInfo m_regInfo;
81
82 #endregion
83
84 #region Constructors
85 public ParcelManager(Scene world, RegionInfo reginfo)
86 {
87
88 m_world = world;
89 m_regInfo = reginfo;
90 parcelIDList.Initialize();
91
92 }
93 #endregion
94
95 #region Member Functions
96
97 #region Parcel From Storage Functions
98 public void ParcelFromStorage(ParcelData data)
99 {
100 Parcel new_parcel = new Parcel(data.ownerID, data.isGroupOwned, m_world);
101 new_parcel.parcelData = data.Copy();
102 new_parcel.setParcelBitmapFromByteArray();
103 addParcel(new_parcel);
104
105 }
106
107 public void NoParcelDataFromStorage()
108 {
109 resetSimParcels();
110 }
111 #endregion
112
113 #region Parcel Add/Remove/Get/Create
114 /// <summary>
115 /// Creates a basic Parcel object without an owner (a zeroed key)
116 /// </summary>
117 /// <returns></returns>
118 public Parcel createBaseParcel()
119 {
120 return new Parcel(new LLUUID(), false, m_world);
121 }
122
123 /// <summary>
124 /// Adds a parcel to the stored list and adds them to the parcelIDList to what they own
125 /// </summary>
126 /// <param name="new_parcel">The parcel being added</param>
127 public void addParcel(Parcel new_parcel)
128 {
129 lastParcelLocalID++;
130 new_parcel.parcelData.localID = lastParcelLocalID;
131 parcelList.Add(lastParcelLocalID, new_parcel.Copy());
132
133
134 bool[,] parcelBitmap = new_parcel.getParcelBitmap();
135 int x, y;
136 for (x = 0; x < 64; x++)
137 {
138 for (y = 0; y < 64; y++)
139 {
140 if (parcelBitmap[x, y])
141 {
142 parcelIDList[x, y] = lastParcelLocalID;
143 }
144 }
145 }
146 parcelList[lastParcelLocalID].forceUpdateParcelInfo();
147
148
149 }
150 /// <summary>
151 /// Removes a parcel from the list. Will not remove if local_id is still owning an area in parcelIDList
152 /// </summary>
153 /// <param name="local_id">Parcel.localID of the parcel to remove.</param>
154 public void removeParcel(int local_id)
155 {
156 int x, y;
157 for (x = 0; x < 64; x++)
158 {
159 for (y = 0; y < 64; y++)
160 {
161 if (parcelIDList[x, y] == local_id)
162 {
163 throw new Exception("Could not remove parcel. Still being used at " + x + ", " + y);
164 }
165 }
166 }
167 m_world.localStorage.RemoveParcel(parcelList[local_id].parcelData);
168 parcelList.Remove(local_id);
169 }
170
171 private void performFinalParcelJoin(Parcel master, Parcel slave)
172 {
173 int x, y;
174 bool[,] parcelBitmapSlave = slave.getParcelBitmap();
175 for (x = 0; x < 64; x++)
176 {
177 for (y = 0; y < 64; y++)
178 {
179 if (parcelBitmapSlave[x, y])
180 {
181 parcelIDList[x, y] = master.parcelData.localID;
182 }
183 }
184 }
185 removeParcel(slave.parcelData.localID);
186 }
187 /// <summary>
188 /// Get the parcel at the specified point
189 /// </summary>
190 /// <param name="x">Value between 0 - 256 on the x axis of the point</param>
191 /// <param name="y">Value between 0 - 256 on the y axis of the point</param>
192 /// <returns>Parcel at the point supplied</returns>
193 public Parcel getParcel(int x, int y)
194 {
195 if (x > 256 || y > 256 || x < 0 || y < 0)
196 {
197 throw new Exception("Error: Parcel not found at point " + x + ", " + y);
198 }
199 else
200 {
201 return parcelList[parcelIDList[x / 4, y / 4]];
202 }
203
204 }
205 #endregion
206
207 #region Parcel Modification
208 /// <summary>
209 /// Subdivides a parcel
210 /// </summary>
211 /// <param name="start_x">West Point</param>
212 /// <param name="start_y">South Point</param>
213 /// <param name="end_x">East Point</param>
214 /// <param name="end_y">North Point</param>
215 /// <param name="attempting_user_id">LLUUID of user who is trying to subdivide</param>
216 /// <returns>Returns true if successful</returns>
217 private bool subdivide(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id)
218 {
219 //First, lets loop through the points and make sure they are all in the same parcel
220 //Get the parcel at start
221 Parcel startParcel = getParcel(start_x, start_y);
222 if (startParcel == null) return false; //No such parcel at the beginning
223
224 //Loop through the points
225 try
226 {
227 int totalX = end_x - start_x;
228 int totalY = end_y - start_y;
229 int x, y;
230 for (y = 0; y < totalY; y++)
231 {
232 for (x = 0; x < totalX; x++)
233 {
234 Parcel tempParcel = getParcel(start_x + x, start_y + y);
235 if (tempParcel == null) return false; //No such parcel at that point
236 if (tempParcel != startParcel) return false; //Subdividing over 2 parcels; no-no
237 }
238 }
239 }
240 catch (Exception)
241 {
242 return false; //Exception. For now, lets skip subdivision
243 }
244
245 //If we are still here, then they are subdividing within one parcel
246 //Check owner
247 if (startParcel.parcelData.ownerID != attempting_user_id)
248 {
249 return false; //They cant do this!
250 }
251
252 //Lets create a new parcel with bitmap activated at that point (keeping the old parcels info)
253 Parcel newParcel = startParcel.Copy();
254 newParcel.parcelData.parcelName = "Subdivision of " + newParcel.parcelData.parcelName;
255 newParcel.parcelData.globalID = LLUUID.Random();
256
257 newParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(start_x, start_y, end_x, end_y));
258
259 //Now, lets set the subdivision area of the original to false
260 int startParcelIndex = startParcel.parcelData.localID;
261 parcelList[startParcelIndex].setParcelBitmap(Parcel.modifyParcelBitmapSquare(startParcel.getParcelBitmap(), start_x, start_y, end_x, end_y, false));
262 parcelList[startParcelIndex].forceUpdateParcelInfo();
263
264
265 //Now add the new parcel
266 addParcel(newParcel);
267
268
269
270
271
272 return true;
273 }
274 /// <summary>
275 /// Join 2 parcels together
276 /// </summary>
277 /// <param name="start_x">x value in first parcel</param>
278 /// <param name="start_y">y value in first parcel</param>
279 /// <param name="end_x">x value in second parcel</param>
280 /// <param name="end_y">y value in second parcel</param>
281 /// <param name="attempting_user_id">LLUUID of the avatar trying to join the parcels</param>
282 /// <returns>Returns true if successful</returns>
283 private bool join(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id)
284 {
285 end_x -= 4;
286 end_y -= 4;
287
288 //NOTE: The following only connects the parcels in each corner and not all the parcels that are within the selection box!
289 //This should be fixed later -- somewhat "incomplete code" --Ming
290 Parcel startParcel, endParcel;
291
292 try
293 {
294 startParcel = getParcel(start_x, start_y);
295 endParcel = getParcel(end_x, end_y);
296 }
297 catch (Exception)
298 {
299 return false; //Error occured when trying to get the start and end parcels
300 }
301 if (startParcel == endParcel)
302 {
303 return false; //Subdivision of the same parcel is not allowed
304 }
305
306 //Check the parcel owners:
307 if (startParcel.parcelData.ownerID != endParcel.parcelData.ownerID)
308 {
309 return false;
310 }
311 if (startParcel.parcelData.ownerID != attempting_user_id)
312 {
313 //TODO: Group editing stuff. Avatar owner support for now
314 return false;
315 }
316
317 //Same owners! Lets join them
318 //Merge them to startParcel
319 parcelList[startParcel.parcelData.localID].setParcelBitmap(Parcel.mergeParcelBitmaps(startParcel.getParcelBitmap(), endParcel.getParcelBitmap()));
320 performFinalParcelJoin(startParcel, endParcel);
321
322 return true;
323
324
325
326 }
327 #endregion
328
329 #region Parcel Updating
330 /// <summary>
331 /// Where we send the ParcelOverlay packet to the client
332 /// </summary>
333 /// <param name="remote_client">The object representing the client</param>
334 public void sendParcelOverlay(IClientAPI remote_client)
335 {
336 const int PARCEL_BLOCKS_PER_PACKET = 1024;
337 int x, y = 0;
338 byte[] byteArray = new byte[PARCEL_BLOCKS_PER_PACKET];
339 int byteArrayCount = 0;
340 int sequenceID = 0;
341 ParcelOverlayPacket packet;
342
343 for (y = 0; y < 64; y++)
344 {
345 for (x = 0; x < 64; x++)
346 {
347 byte tempByte = (byte)0; //This represents the byte for the current 4x4
348 Parcel currentParcelBlock = getParcel(x * 4, y * 4);
349
350 if (currentParcelBlock.parcelData.ownerID == remote_client.AgentId)
351 {
352 //Owner Flag
353 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_REQUESTER);
354 }
355 else if (currentParcelBlock.parcelData.salePrice > 0 && (currentParcelBlock.parcelData.authBuyerID == LLUUID.Zero || currentParcelBlock.parcelData.authBuyerID == remote_client.AgentId))
356 {
357 //Sale Flag
358 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_IS_FOR_SALE);
359 }
360 else if (currentParcelBlock.parcelData.ownerID == LLUUID.Zero)
361 {
362 //Public Flag
363 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_PUBLIC);
364 }
365 else
366 {
367 //Other Flag
368 tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_OTHER);
369 }
370
371
372 //Now for border control
373 if (x == 0)
374 {
375 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST);
376 }
377 else if (getParcel((x - 1) * 4, y * 4) != currentParcelBlock)
378 {
379 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST);
380 }
381
382 if (y == 0)
383 {
384 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH);
385 }
386 else if (getParcel(x * 4, (y - 1) * 4) != currentParcelBlock)
387 {
388 tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH);
389 }
390
391 byteArray[byteArrayCount] = tempByte;
392 byteArrayCount++;
393 if (byteArrayCount >= PARCEL_BLOCKS_PER_PACKET)
394 {
395 byteArrayCount = 0;
396 packet = new ParcelOverlayPacket();
397 packet.ParcelData.Data = byteArray;
398 packet.ParcelData.SequenceID = sequenceID;
399 remote_client.OutPacket((Packet)packet);
400 sequenceID++;
401 byteArray = new byte[PARCEL_BLOCKS_PER_PACKET];
402 }
403 }
404 }
405
406 packet = new ParcelOverlayPacket();
407 packet.ParcelData.Data = byteArray;
408 packet.ParcelData.SequenceID = sequenceID; //Eh?
409 remote_client.OutPacket((Packet)packet);
410 }
411
412 public void handleParcelPropertiesRequest(int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client)
413 {
414 //Get the parcels within the bounds
415 List<Parcel> temp = new List<Parcel>();
416 int x, y, i;
417 int inc_x = end_x - start_x;
418 int inc_y = end_y - start_y;
419 for (x = 0; x < inc_x; x++)
420 {
421 for (y = 0; y < inc_y; y++)
422 {
423 OpenSim.Region.Parcel currentParcel = getParcel(start_x + x, start_y + y);
424 if (!temp.Contains(currentParcel))
425 {
426 currentParcel.forceUpdateParcelInfo();
427 temp.Add(currentParcel);
428 }
429 }
430 }
431
432 int requestResult = ParcelManager.PARCEL_RESULT_ONE_PARCEL;
433 if (temp.Count > 1)
434 {
435 requestResult = ParcelManager.PARCEL_RESULT_MULTIPLE_PARCELS;
436 }
437
438 for (i = 0; i < temp.Count; i++)
439 {
440 temp[i].sendParcelProperties(sequence_id, snap_selection, requestResult, remote_client);
441 }
442
443
444 sendParcelOverlay(remote_client);
445 }
446
447 public void handleParcelPropertiesUpdateRequest(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client)
448 {
449 if (parcelList.ContainsKey(packet.ParcelData.LocalID))
450 {
451 parcelList[packet.ParcelData.LocalID].updateParcelProperties(packet, remote_client);
452 }
453 }
454 public void handleParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client)
455 {
456 subdivide(west, south, east, north, remote_client.AgentId);
457 }
458 public void handleParcelJoinRequest(int west, int south, int east, int north, IClientAPI remote_client)
459 {
460 join(west, south, east, north, remote_client.AgentId);
461
462 }
463 #endregion
464
465 /// <summary>
466 /// Resets the sim to the default parcel (full sim parcel owned by the default user)
467 /// </summary>
468 public void resetSimParcels()
469 {
470 //Remove all the parcels in the sim and add a blank, full sim parcel set to public
471 parcelList.Clear();
472 lastParcelLocalID = START_PARCEL_LOCAL_ID - 1;
473 parcelIDList.Initialize();
474
475 Parcel fullSimParcel = new Parcel(LLUUID.Zero, false, m_world);
476
477 fullSimParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(0, 0, 256, 256));
478 fullSimParcel.parcelData.parcelName = "Your Sim Parcel";
479 fullSimParcel.parcelData.parcelDesc = "";
480
481 fullSimParcel.parcelData.ownerID = m_regInfo.MasterAvatarAssignedUUID;
482 fullSimParcel.parcelData.salePrice = 1;
483 fullSimParcel.parcelData.parcelFlags = libsecondlife.Parcel.ParcelFlags.ForSale;
484 fullSimParcel.parcelData.parcelStatus = libsecondlife.Parcel.ParcelStatus.Leased;
485
486 addParcel(fullSimParcel);
487
488 }
489 #endregion
490 }
491 #endregion
492
493
494 #region Parcel Class
495 /// <summary>
496 /// Keeps track of a specific parcel's information
497 /// </summary>
498 public class Parcel
499 {
500 #region Member Variables
501 public ParcelData parcelData = new ParcelData();
502 public Scene m_world;
503
504 private bool[,] parcelBitmap = new bool[64, 64];
505
506 #endregion
507
508
509 #region Constructors
510 public Parcel(LLUUID owner_id, bool is_group_owned, Scene world)
511 {
512 m_world = world;
513 parcelData.ownerID = owner_id;
514 parcelData.isGroupOwned = is_group_owned;
515
516 }
517 #endregion
518
519
520 #region Member Functions
521
522 #region General Functions
523 /// <summary>
524 /// Checks to see if this parcel contains a point
525 /// </summary>
526 /// <param name="x"></param>
527 /// <param name="y"></param>
528 /// <returns>Returns true if the parcel contains the specified point</returns>
529 public bool containsPoint(int x, int y)
530 {
531 if (x >= 0 && y >= 0 && x <= 256 && x <= 256)
532 {
533 return (parcelBitmap[x / 4, y / 4] == true);
534 }
535 else
536 {
537 return false;
538 }
539 }
540
541 public Parcel Copy()
542 {
543 Parcel newParcel = new Parcel(this.parcelData.ownerID, this.parcelData.isGroupOwned, m_world);
544
545 //Place all new variables here!
546 newParcel.parcelBitmap = (bool[,])(this.parcelBitmap.Clone());
547 newParcel.parcelData = parcelData.Copy();
548
549 return newParcel;
550 }
551
552 #endregion
553
554
555 #region Packet Request Handling
556 /// <summary>
557 /// Sends parcel properties as requested
558 /// </summary>
559 /// <param name="sequence_id">ID sent by client for them to keep track of</param>
560 /// <param name="snap_selection">Bool sent by client for them to use</param>
561 /// <param name="remote_client">Object representing the client</param>
562 public void sendParcelProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client)
563 {
564
565 ParcelPropertiesPacket updatePacket = new ParcelPropertiesPacket();
566 updatePacket.ParcelData.AABBMax = parcelData.AABBMax;
567 updatePacket.ParcelData.AABBMin = parcelData.AABBMin;
568 updatePacket.ParcelData.Area = parcelData.area;
569 updatePacket.ParcelData.AuctionID = parcelData.auctionID;
570 updatePacket.ParcelData.AuthBuyerID = parcelData.authBuyerID; //unemplemented
571
572 updatePacket.ParcelData.Bitmap = parcelData.parcelBitmapByteArray;
573
574 updatePacket.ParcelData.Desc = libsecondlife.Helpers.StringToField(parcelData.parcelDesc);
575 updatePacket.ParcelData.Category = (byte)parcelData.category;
576 updatePacket.ParcelData.ClaimDate = parcelData.claimDate;
577 updatePacket.ParcelData.ClaimPrice = parcelData.claimPrice;
578 updatePacket.ParcelData.GroupID = parcelData.groupID;
579 updatePacket.ParcelData.GroupPrims = parcelData.groupPrims;
580 updatePacket.ParcelData.IsGroupOwned = parcelData.isGroupOwned;
581 updatePacket.ParcelData.LandingType = (byte)parcelData.landingType;
582 updatePacket.ParcelData.LocalID = parcelData.localID;
583 updatePacket.ParcelData.MaxPrims = 1000; //unemplemented
584 updatePacket.ParcelData.MediaAutoScale = parcelData.mediaAutoScale;
585 updatePacket.ParcelData.MediaID = parcelData.mediaID;
586 updatePacket.ParcelData.MediaURL = Helpers.StringToField(parcelData.mediaURL);
587 updatePacket.ParcelData.MusicURL = Helpers.StringToField(parcelData.musicURL);
588 updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName);
589 updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented
590 updatePacket.ParcelData.OtherCount = 0; //unemplemented
591 updatePacket.ParcelData.OtherPrims = 0; //unemplented
592 updatePacket.ParcelData.OwnerID = parcelData.ownerID;
593 updatePacket.ParcelData.OwnerPrims = 0; //unemplemented
594 updatePacket.ParcelData.ParcelFlags = (uint)parcelData.parcelFlags; //unemplemented
595 updatePacket.ParcelData.ParcelPrimBonus = (float)1.0; //unemplemented
596 updatePacket.ParcelData.PassHours = parcelData.passHours;
597 updatePacket.ParcelData.PassPrice = parcelData.passPrice;
598 updatePacket.ParcelData.PublicCount = 0; //unemplemented
599 updatePacket.ParcelData.RegionDenyAnonymous = false; //unemplemented
600 updatePacket.ParcelData.RegionDenyIdentified = false; //unemplemented
601 updatePacket.ParcelData.RegionDenyTransacted = false; //unemplemented
602 updatePacket.ParcelData.RegionPushOverride = true; //unemplemented
603 updatePacket.ParcelData.RentPrice = 0; //??
604 updatePacket.ParcelData.RequestResult = request_result;
605 updatePacket.ParcelData.SalePrice = parcelData.salePrice; //unemplemented
606 updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented
607 updatePacket.ParcelData.SelfCount = 0;//unemplemented
608 updatePacket.ParcelData.SequenceID = sequence_id;
609 updatePacket.ParcelData.SimWideMaxPrims = 15000; //unemplemented
610 updatePacket.ParcelData.SimWideTotalPrims = 0; //unemplemented
611 updatePacket.ParcelData.SnapSelection = snap_selection;
612 updatePacket.ParcelData.SnapshotID = parcelData.snapshotID;
613 updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus;
614 updatePacket.ParcelData.TotalPrims = 0; //unemplemented
615 updatePacket.ParcelData.UserLocation = parcelData.userLocation;
616 updatePacket.ParcelData.UserLookAt = parcelData.userLookAt;
617 remote_client.OutPacket((Packet)updatePacket);
618 }
619
620 public void updateParcelProperties(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client)
621 {
622 if (remote_client.AgentId == parcelData.ownerID)
623 {
624 //Needs later group support
625 parcelData.authBuyerID = packet.ParcelData.AuthBuyerID;
626 parcelData.category = (libsecondlife.Parcel.ParcelCategory)packet.ParcelData.Category;
627 parcelData.parcelDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc);
628 parcelData.groupID = packet.ParcelData.GroupID;
629 parcelData.landingType = packet.ParcelData.LandingType;
630 parcelData.mediaAutoScale = packet.ParcelData.MediaAutoScale;
631 parcelData.mediaID = packet.ParcelData.MediaID;
632 parcelData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL);
633 parcelData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL);
634 parcelData.parcelName = libsecondlife.Helpers.FieldToUTF8String(packet.ParcelData.Name);
635 parcelData.parcelFlags = (libsecondlife.Parcel.ParcelFlags)packet.ParcelData.ParcelFlags;
636 parcelData.passHours = packet.ParcelData.PassHours;
637 parcelData.passPrice = packet.ParcelData.PassPrice;
638 parcelData.salePrice = packet.ParcelData.SalePrice;
639 parcelData.snapshotID = packet.ParcelData.SnapshotID;
640 parcelData.userLocation = packet.ParcelData.UserLocation;
641 parcelData.userLookAt = packet.ParcelData.UserLookAt;
642
643 List<Avatar> avatars = m_world.RequestAvatarList();
644
645 for (int i = 0; i < avatars.Count; i++)
646 {
647 Parcel over = m_world.parcelManager.getParcel((int)Math.Round(avatars[i].Pos.X), (int)Math.Round(avatars[i].Pos.Y));
648 if (over == this)
649 {
650 sendParcelProperties(0, false, 0, avatars[i].ControllingClient);
651 }
652 }
653
654 }
655 }
656 #endregion
657
658
659 #region Update Functions
660 /// <summary>
661 /// Updates the AABBMin and AABBMax values after area/shape modification of parcel
662 /// </summary>
663 private void updateAABBAndAreaValues()
664 {
665 int min_x = 64;
666 int min_y = 64;
667 int max_x = 0;
668 int max_y = 0;
669 int tempArea = 0;
670 int x, y;
671 for (x = 0; x < 64; x++)
672 {
673 for (y = 0; y < 64; y++)
674 {
675 if (parcelBitmap[x, y] == true)
676 {
677 if (min_x > x) min_x = x;
678 if (min_y > y) min_y = y;
679 if (max_x < x) max_x = x;
680 if (max_y < y) max_y = y;
681 tempArea += 16; //16sqm parcel
682 }
683 }
684 }
685 parcelData.AABBMin = new LLVector3((float)(min_x * 4), (float)(min_y * 4), m_world.Terrain[(min_x * 4), (min_y * 4)]);
686 parcelData.AABBMax = new LLVector3((float)(max_x * 4), (float)(max_y * 4), m_world.Terrain[(max_x * 4), (max_y * 4)]);
687 parcelData.area = tempArea;
688 }
689
690 public void updateParcelBitmapByteArray()
691 {
692 parcelData.parcelBitmapByteArray = convertParcelBitmapToBytes();
693 }
694
695 /// <summary>
696 /// Update all settings in parcel such as area, bitmap byte array, etc
697 /// </summary>
698 public void forceUpdateParcelInfo()
699 {
700 this.updateAABBAndAreaValues();
701 this.updateParcelBitmapByteArray();
702 }
703
704 public void setParcelBitmapFromByteArray()
705 {
706 parcelBitmap = convertBytesToParcelBitmap();
707 }
708 #endregion
709
710
711 #region Parcel Bitmap Functions
712 /// <summary>
713 /// Sets the parcel's bitmap manually
714 /// </summary>
715 /// <param name="bitmap">64x64 block representing where this parcel is on a map</param>
716 public void setParcelBitmap(bool[,] bitmap)
717 {
718 if (bitmap.GetLength(0) != 64 || bitmap.GetLength(1) != 64 || bitmap.Rank != 2)
719 {
720 //Throw an exception - The bitmap is not 64x64
721 throw new Exception("Error: Invalid Parcel Bitmap");
722 }
723 else
724 {
725 //Valid: Lets set it
726 parcelBitmap = bitmap;
727 forceUpdateParcelInfo();
728
729 }
730 }
731 /// <summary>
732 /// Gets the parcels bitmap manually
733 /// </summary>
734 /// <returns></returns>
735 public bool[,] getParcelBitmap()
736 {
737 return parcelBitmap;
738 }
739 /// <summary>
740 /// Converts the parcel bitmap to a packet friendly byte array
741 /// </summary>
742 /// <returns></returns>
743 private byte[] convertParcelBitmapToBytes()
744 {
745 byte[] tempConvertArr = new byte[512];
746 byte tempByte = 0;
747 int x, y, i, byteNum = 0;
748 i = 0;
749 for (y = 0; y < 64; y++)
750 {
751 for (x = 0; x < 64; x++)
752 {
753 tempByte = Convert.ToByte(tempByte | Convert.ToByte(parcelBitmap[x, y]) << (i++ % 8));
754 if (i % 8 == 0)
755 {
756 tempConvertArr[byteNum] = tempByte;
757 tempByte = (byte)0;
758 i = 0;
759 byteNum++;
760 }
761 }
762 }
763 return tempConvertArr;
764 }
765
766 private bool[,] convertBytesToParcelBitmap()
767 {
768 bool[,] tempConvertMap = new bool[64, 64];
769 tempConvertMap.Initialize();
770 byte tempByte = 0;
771 int x = 0, y = 0, i = 0, bitNum = 0;
772 for (i = 0; i < 512; i++)
773 {
774 tempByte = parcelData.parcelBitmapByteArray[i];
775 for (bitNum = 0; bitNum < 8; bitNum++)
776 {
777 bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte)1);
778 tempConvertMap[x, y] = bit;
779 x++;
780 if (x > 63)
781 {
782 x = 0;
783 y++;
784 }
785
786 }
787
788 }
789 return tempConvertMap;
790 }
791 /// <summary>
792 /// Full sim parcel creation
793 /// </summary>
794 /// <returns></returns>
795 public static bool[,] basicFullRegionParcelBitmap()
796 {
797 return getSquareParcelBitmap(0, 0, 256, 256);
798 }
799
800 /// <summary>
801 /// Used to modify the bitmap between the x and y points. Points use 64 scale
802 /// </summary>
803 /// <param name="start_x"></param>
804 /// <param name="start_y"></param>
805 /// <param name="end_x"></param>
806 /// <param name="end_y"></param>
807 /// <returns></returns>
808 public static bool[,] getSquareParcelBitmap(int start_x, int start_y, int end_x, int end_y)
809 {
810
811 bool[,] tempBitmap = new bool[64, 64];
812 tempBitmap.Initialize();
813
814 tempBitmap = modifyParcelBitmapSquare(tempBitmap, start_x, start_y, end_x, end_y, true);
815 return tempBitmap;
816 }
817
818 /// <summary>
819 /// Change a parcel's bitmap at within a square and set those points to a specific value
820 /// </summary>
821 /// <param name="parcel_bitmap"></param>
822 /// <param name="start_x"></param>
823 /// <param name="start_y"></param>
824 /// <param name="end_x"></param>
825 /// <param name="end_y"></param>
826 /// <param name="set_value"></param>
827 /// <returns></returns>
828 public static bool[,] modifyParcelBitmapSquare(bool[,] parcel_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value)
829 {
830 if (parcel_bitmap.GetLength(0) != 64 || parcel_bitmap.GetLength(1) != 64 || parcel_bitmap.Rank != 2)
831 {
832 //Throw an exception - The bitmap is not 64x64
833 throw new Exception("Error: Invalid Parcel Bitmap in modifyParcelBitmapSquare()");
834 }
835
836 int x, y;
837 for (y = 0; y < 64; y++)
838 {
839 for (x = 0; x < 64; x++)
840 {
841 if (x >= start_x / 4 && x < end_x / 4
842 && y >= start_y / 4 && y < end_y / 4)
843 {
844 parcel_bitmap[x, y] = set_value;
845 }
846 }
847 }
848 return parcel_bitmap;
849 }
850 /// <summary>
851 /// Join the true values of 2 bitmaps together
852 /// </summary>
853 /// <param name="bitmap_base"></param>
854 /// <param name="bitmap_add"></param>
855 /// <returns></returns>
856 public static bool[,] mergeParcelBitmaps(bool[,] bitmap_base, bool[,] bitmap_add)
857 {
858 if (bitmap_base.GetLength(0) != 64 || bitmap_base.GetLength(1) != 64 || bitmap_base.Rank != 2)
859 {
860 //Throw an exception - The bitmap is not 64x64
861 throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_base in mergeParcelBitmaps");
862 }
863 if (bitmap_add.GetLength(0) != 64 || bitmap_add.GetLength(1) != 64 || bitmap_add.Rank != 2)
864 {
865 //Throw an exception - The bitmap is not 64x64
866 throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_add in mergeParcelBitmaps");
867
868 }
869
870 int x, y;
871 for (y = 0; y < 64; y++)
872 {
873 for (x = 0; x < 64; x++)
874 {
875 if (bitmap_add[x, y])
876 {
877 bitmap_base[x, y] = true;
878 }
879 }
880 }
881 return bitmap_base;
882 }
883 #endregion
884
885 #endregion
886
887
888 }
889 #endregion
890
891
892}
diff --git a/OpenSim/Region/Simulation/RegionManager.cs b/OpenSim/Region/Simulation/RegionManager.cs
new file mode 100644
index 0000000..a317f0f
--- /dev/null
+++ b/OpenSim/Region/Simulation/RegionManager.cs
@@ -0,0 +1,30 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenGrid.Framework.Communications;
5using OpenSim.Framework;
6using OpenSim.Framework.Types;
7using OpenSim.Servers;
8
9namespace OpenSim.Region
10{
11 public class RegionManager //needs renaming , but first we need to rename the namespace
12 {
13 protected AuthenticateSessionsBase authenticateHandler;
14 protected RegionCommsListener regionCommsHost;
15 protected CommunicationsManager commsManager;
16 protected List<Caps> capsHandlers = new List<Caps>();
17 protected BaseHttpServer httpListener;
18
19 protected Scenes.Scene m_Scene;
20
21 public ParcelManager parcelManager;
22 public EstateManager estateManager;
23
24 public RegionManager()
25 {
26
27 }
28
29 }
30}
diff --git a/OpenSim/Region/Simulation/Scenes/Entity.cs b/OpenSim/Region/Simulation/Scenes/Entity.cs
new file mode 100644
index 0000000..f8754f5
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Entity.cs
@@ -0,0 +1,194 @@
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 Axiom.MathLib;
32using OpenSim.Physics.Manager;
33using libsecondlife;
34using OpenSim.Region.Scripting;
35
36namespace OpenSim.Region.Scenes
37{
38 public abstract class Entity : IScriptReadonlyEntity
39 {
40 public libsecondlife.LLUUID uuid;
41 public Quaternion rotation;
42 protected List<Entity> children;
43
44 protected PhysicsActor _physActor;
45 protected Scene m_world;
46 protected string m_name;
47
48 /// <summary>
49 ///
50 /// </summary>
51 public virtual string Name
52 {
53 get { return m_name; }
54 }
55
56 protected LLVector3 m_pos;
57 /// <summary>
58 ///
59 /// </summary>
60 public virtual LLVector3 Pos
61 {
62 get
63 {
64 if (this._physActor != null)
65 {
66 m_pos.X = _physActor.Position.X;
67 m_pos.Y = _physActor.Position.Y;
68 m_pos.Z = _physActor.Position.Z;
69 }
70
71 return m_pos;
72 }
73 set
74 {
75 if (this._physActor != null)
76 {
77 try
78 {
79 lock (this.m_world.SyncRoot)
80 {
81
82 this._physActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
83 }
84 }
85 catch (Exception e)
86 {
87 Console.WriteLine(e.Message);
88 }
89 }
90
91 m_pos = value;
92 }
93 }
94
95 public LLVector3 velocity;
96
97 /// <summary>
98 ///
99 /// </summary>
100 public virtual LLVector3 Velocity
101 {
102 get
103 {
104 if (this._physActor != null)
105 {
106 velocity.X = _physActor.Velocity.X;
107 velocity.Y = _physActor.Velocity.Y;
108 velocity.Z = _physActor.Velocity.Z;
109 }
110
111 return velocity;
112 }
113 set
114 {
115 if (this._physActor != null)
116 {
117 try
118 {
119 lock (this.m_world.SyncRoot)
120 {
121
122 this._physActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z);
123 }
124 }
125 catch (Exception e)
126 {
127 Console.WriteLine(e.Message);
128 }
129 }
130
131 velocity = value;
132 }
133 }
134
135 protected uint m_localId;
136
137 public uint LocalId
138 {
139 get { return m_localId; }
140 }
141
142 /// <summary>
143 /// Creates a new Entity (should not occur on it's own)
144 /// </summary>
145 public Entity()
146 {
147 uuid = new libsecondlife.LLUUID();
148
149 m_pos = new LLVector3();
150 velocity = new LLVector3();
151 rotation = new Quaternion();
152 m_name = "(basic entity)";
153 children = new List<Entity>();
154 }
155
156 /// <summary>
157 ///
158 /// </summary>
159 public virtual void updateMovement()
160 {
161 foreach (Entity child in children)
162 {
163 child.updateMovement();
164 }
165 }
166
167 /// <summary>
168 /// Performs any updates that need to be done at each frame. This function is overridable from it's children.
169 /// </summary>
170 public virtual void update() {
171 // Do any per-frame updates needed that are applicable to every type of entity
172 foreach (Entity child in children)
173 {
174 child.update();
175 }
176 }
177
178 /// <summary>
179 /// Called at a set interval to inform entities that they should back themsleves up to the DB
180 /// </summary>
181 public virtual void BackUp()
182 {
183
184 }
185
186 /// <summary>
187 /// Infoms the entity that the land (heightmap) has changed
188 /// </summary>
189 public virtual void LandRenegerated()
190 {
191
192 }
193 }
194}
diff --git a/OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs b/OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs
new file mode 100644
index 0000000..65077e6
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs
@@ -0,0 +1,19 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using libsecondlife;
5using libsecondlife.Packets;
6using OpenSim.Physics.Manager;
7using OpenSim.Framework.Interfaces;
8using OpenSim.Framework.Types;
9
10namespace OpenSim.Region.Scenes
11{
12 public interface IScenePresenceBody
13 {
14 void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation);
15 void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam);
16 void SendOurAppearance(IClientAPI OurClient);
17 void SendAppearanceToOtherAgent(ScenePresence avatarInfo);
18 }
19}
diff --git a/OpenSim/Region/Simulation/Scenes/Primitive.cs b/OpenSim/Region/Simulation/Scenes/Primitive.cs
new file mode 100644
index 0000000..e04c711
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Primitive.cs
@@ -0,0 +1,582 @@
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 libsecondlife;
33using libsecondlife.Packets;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Physics.Manager;
36using OpenSim.Framework.Types;
37using OpenSim.Framework.Inventory;
38
39namespace OpenSim.Region.Scenes
40{
41 public class Primitive : Entity
42 {
43 internal PrimData primData;
44 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
45 // private Dictionary<uint, IClientAPI> m_clientThreads;
46 private ulong m_regionHandle;
47 private const uint FULL_MASK_PERMISSIONS = 2147483647;
48 private bool physicsEnabled = false;
49 private byte updateFlag = 0;
50 private uint flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128;
51
52 private Dictionary<LLUUID, InventoryItem> inventoryItems;
53
54 #region Properties
55
56 public LLVector3 Scale
57 {
58 set
59 {
60 this.primData.Scale = value;
61 //this.dirtyFlag = true;
62 }
63 get
64 {
65 return this.primData.Scale;
66 }
67 }
68
69 public PhysicsActor PhysActor
70 {
71 set
72 {
73 this._physActor = value;
74 }
75 }
76
77 public override LLVector3 Pos
78 {
79 get
80 {
81 return base.Pos;
82 }
83 set
84 {
85 base.Pos = value;
86 }
87 }
88 #endregion
89
90 /// <summary>
91 ///
92 /// </summary>
93 /// <param name="clientThreads"></param>
94 /// <param name="regionHandle"></param>
95 /// <param name="world"></param>
96 public Primitive( ulong regionHandle, Scene world)
97 {
98 // m_clientThreads = clientThreads;
99 m_regionHandle = regionHandle;
100 m_world = world;
101 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
102 }
103
104 /// <summary>
105 ///
106 /// </summary>
107 /// <param name="regionHandle"></param>
108 /// <param name="world"></param>
109 /// <param name="addPacket"></param>
110 /// <param name="ownerID"></param>
111 /// <param name="localID"></param>
112 public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
113 {
114 // m_clientThreads = clientThreads;
115 m_regionHandle = regionHandle;
116 m_world = world;
117 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
118 this.CreateFromPacket(addPacket, ownerID, localID);
119 }
120
121 /// <summary>
122 ///
123 /// </summary>
124 /// <param name="clientThreads"></param>
125 /// <param name="regionHandle"></param>
126 /// <param name="world"></param>
127 /// <param name="owner"></param>
128 /// <param name="fullID"></param>
129 /// <param name="localID"></param>
130 public Primitive( ulong regionHandle, Scene world, LLUUID owner, LLUUID fullID, uint localID)
131 {
132 // m_clientThreads = clientThreads;
133 m_regionHandle = regionHandle;
134 m_world = world;
135 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
136 this.primData = new PrimData();
137 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
138 this.primData.OwnerID = owner;
139 this.primData.FullID = this.uuid = fullID;
140 this.primData.LocalID = m_localId = localID;
141 }
142
143 /// <summary>
144 /// Constructor to create a default cube
145 /// </summary>
146 /// <param name="clientThreads"></param>
147 /// <param name="regionHandle"></param>
148 /// <param name="world"></param>
149 /// <param name="owner"></param>
150 /// <param name="localID"></param>
151 /// <param name="position"></param>
152 public Primitive( ulong regionHandle, Scene world, LLUUID owner, uint localID, LLVector3 position)
153 {
154 //m_clientThreads = clientThreads;
155 m_regionHandle = regionHandle;
156 m_world = world;
157 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
158 this.primData = PrimData.DefaultCube();
159 this.primData.OwnerID = owner;
160 this.primData.LocalID = m_localId = localID;
161 this.Pos = this.primData.Position = position;
162
163 this.updateFlag = 1;
164 }
165
166 /// <summary>
167 ///
168 /// </summary>
169 /// <returns></returns>
170 public byte[] GetByteArray()
171 {
172 byte[] result = null;
173 List<byte[]> dataArrays = new List<byte[]>();
174 dataArrays.Add(primData.ToBytes());
175 foreach (Entity child in children)
176 {
177 if (child is OpenSim.Region.Scenes.Primitive)
178 {
179 dataArrays.Add(((OpenSim.Region.Scenes.Primitive)child).GetByteArray());
180 }
181 }
182 byte[] primstart = Helpers.StringToField("<Prim>");
183 byte[] primend = Helpers.StringToField("</Prim>");
184 int totalLength = primstart.Length + primend.Length;
185 for (int i = 0; i < dataArrays.Count; i++)
186 {
187 totalLength += dataArrays[i].Length;
188 }
189
190 result = new byte[totalLength];
191 int arraypos = 0;
192 Array.Copy(primstart, 0, result, 0, primstart.Length);
193 arraypos += primstart.Length;
194 for (int i = 0; i < dataArrays.Count; i++)
195 {
196 Array.Copy(dataArrays[i], 0, result, arraypos, dataArrays[i].Length);
197 arraypos += dataArrays[i].Length;
198 }
199 Array.Copy(primend, 0, result, arraypos, primend.Length);
200
201 return result;
202 }
203
204 #region Overridden Methods
205
206 /// <summary>
207 ///
208 /// </summary>
209 public override void update()
210 {
211 if (this.updateFlag == 1) // is a new prim just been created/reloaded
212 {
213 this.SendFullUpdateToAllClients();
214 this.updateFlag = 0;
215 }
216 if (this.updateFlag == 2) //some change has been made so update the clients
217 {
218 this.SendTerseUpdateToALLClients();
219 this.updateFlag = 0;
220 }
221 }
222
223 /// <summary>
224 ///
225 /// </summary>
226 public override void BackUp()
227 {
228
229 }
230
231 #endregion
232
233 #region Packet handlers
234
235 /// <summary>
236 ///
237 /// </summary>
238 /// <param name="pos"></param>
239 public void UpdatePosition(LLVector3 pos)
240 {
241 this.Pos = new LLVector3(pos.X, pos.Y, pos.Z);
242 this.updateFlag = 2;
243 }
244
245 /// <summary>
246 ///
247 /// </summary>
248 /// <param name="addPacket"></param>
249 public void UpdateShape(ObjectShapePacket.ObjectDataBlock updatePacket)
250 {
251 this.primData.PathBegin = updatePacket.PathBegin;
252 this.primData.PathEnd = updatePacket.PathEnd;
253 this.primData.PathScaleX = updatePacket.PathScaleX;
254 this.primData.PathScaleY = updatePacket.PathScaleY;
255 this.primData.PathShearX = updatePacket.PathShearX;
256 this.primData.PathShearY = updatePacket.PathShearY;
257 this.primData.PathSkew = updatePacket.PathSkew;
258 this.primData.ProfileBegin = updatePacket.ProfileBegin;
259 this.primData.ProfileEnd = updatePacket.ProfileEnd;
260 this.primData.PathCurve = updatePacket.PathCurve;
261 this.primData.ProfileCurve = updatePacket.ProfileCurve;
262 this.primData.ProfileHollow = updatePacket.ProfileHollow;
263 this.primData.PathRadiusOffset = updatePacket.PathRadiusOffset;
264 this.primData.PathRevolutions = updatePacket.PathRevolutions;
265 this.primData.PathTaperX = updatePacket.PathTaperX;
266 this.primData.PathTaperY = updatePacket.PathTaperY;
267 this.primData.PathTwist = updatePacket.PathTwist;
268 this.primData.PathTwistBegin = updatePacket.PathTwistBegin;
269 }
270
271 /// <summary>
272 ///
273 /// </summary>
274 /// <param name="tex"></param>
275 public void UpdateTexture(byte[] tex)
276 {
277 this.primData.TextureEntry = tex;
278 }
279
280 /// <summary>
281 ///
282 /// </summary>
283 /// <param name="pack"></param>
284 public void UpdateObjectFlags(ObjectFlagUpdatePacket pack)
285 {
286
287 }
288
289 /// <summary>
290 ///
291 /// </summary>
292 /// <param name="prim"></param>
293 public void AssignToParent(Primitive prim)
294 {
295
296 }
297
298 #endregion
299
300 # region Inventory Methods
301 /// <summary>
302 ///
303 /// </summary>
304 /// <param name="item"></param>
305 /// <returns></returns>
306 public bool AddToInventory(InventoryItem item)
307 {
308 return false;
309 }
310
311 /// <summary>
312 ///
313 /// </summary>
314 /// <param name="itemID"></param>
315 /// <returns></returns>
316 public InventoryItem RemoveFromInventory(LLUUID itemID)
317 {
318 return null;
319 }
320
321 /// <summary>
322 ///
323 /// </summary>
324 /// <param name="simClient"></param>
325 /// <param name="packet"></param>
326 public void RequestInventoryInfo(IClientAPI simClient, RequestTaskInventoryPacket packet)
327 {
328
329 }
330
331 /// <summary>
332 ///
333 /// </summary>
334 /// <param name="simClient"></param>
335 /// <param name="xferID"></param>
336 public void RequestXferInventory(IClientAPI simClient, ulong xferID)
337 {
338 //will only currently work if the total size of the inventory data array is under about 1000 bytes
339 SendXferPacketPacket send = new SendXferPacketPacket();
340
341 send.XferID.ID = xferID;
342 send.XferID.Packet = 1 + 2147483648;
343 send.DataPacket.Data = this.ConvertInventoryToBytes();
344
345 simClient.OutPacket(send);
346 }
347
348 /// <summary>
349 ///
350 /// </summary>
351 /// <returns></returns>
352 public byte[] ConvertInventoryToBytes()
353 {
354 System.Text.Encoding enc = System.Text.Encoding.ASCII;
355 byte[] result = new byte[0];
356 List<byte[]> inventoryData = new List<byte[]>();
357 int totallength = 0;
358 foreach (InventoryItem invItem in inventoryItems.Values)
359 {
360 byte[] data = enc.GetBytes(invItem.ExportString());
361 inventoryData.Add(data);
362 totallength += data.Length;
363 }
364 //TODO: copy arrays into the single result array
365
366 return result;
367 }
368
369 /// <summary>
370 ///
371 /// </summary>
372 /// <param name="data"></param>
373 public void CreateInventoryFromBytes(byte[] data)
374 {
375
376 }
377
378 #endregion
379
380 #region Update viewers Methods
381
382 /// <summary>
383 ///
384 /// </summary>
385 /// <param name="remoteClient"></param>
386 public void SendFullUpdateForAllChildren(IClientAPI remoteClient)
387 {
388 this.SendFullUpdateToClient(remoteClient);
389 for (int i = 0; i < this.children.Count; i++)
390 {
391 if (this.children[i] is Primitive)
392 {
393 ((Primitive)this.children[i]).SendFullUpdateForAllChildren(remoteClient);
394 }
395 }
396 }
397
398 /// <summary>
399 ///
400 /// </summary>
401 /// <param name="remoteClient"></param>
402 public void SendFullUpdateToClient(IClientAPI remoteClient)
403 {
404 LLVector3 lPos;
405 if (this._physActor != null && this.physicsEnabled)
406 {
407 PhysicsVector pPos = this._physActor.Position;
408 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
409 }
410 else
411 {
412 lPos = this.Pos;
413 }
414
415 remoteClient.SendPrimitiveToClient(this.m_regionHandle, 64096, this.LocalId, this.primData, lPos, new LLUUID("00000000-0000-0000-9999-000000000005"), this.flags);
416 }
417
418 /// <summary>
419 ///
420 /// </summary>
421 public void SendFullUpdateToAllClients()
422 {
423 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
424 for (int i = 0; i < avatars.Count; i++)
425 {
426 this.SendFullUpdateToClient(avatars[i].ControllingClient);
427 }
428 }
429
430 /// <summary>
431 ///
432 /// </summary>
433 /// <param name="RemoteClient"></param>
434 public void SendTerseUpdateToClient(IClientAPI RemoteClient)
435 {
436 LLVector3 lPos;
437 Axiom.MathLib.Quaternion lRot;
438 if (this._physActor != null && this.physicsEnabled) //is this needed ? doesn't the property fields do this for us?
439 {
440 PhysicsVector pPos = this._physActor.Position;
441 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
442 lRot = this._physActor.Orientation;
443 }
444 else
445 {
446 lPos = this.Pos;
447 lRot = this.rotation;
448 }
449 LLQuaternion mRot = new LLQuaternion(lRot.x, lRot.y, lRot.z, lRot.w);
450 RemoteClient.SendPrimTerseUpdate(this.m_regionHandle, 64096, this.LocalId, lPos, mRot);
451 }
452
453 /// <summary>
454 ///
455 /// </summary>
456 public void SendTerseUpdateToALLClients()
457 {
458 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
459 for (int i = 0; i < avatars.Count; i++)
460 {
461 this.SendTerseUpdateToClient(avatars[i].ControllingClient);
462 }
463 }
464
465 #endregion
466
467 #region Create Methods
468
469 /// <summary>
470 ///
471 /// </summary>
472 /// <param name="addPacket"></param>
473 /// <param name="ownerID"></param>
474 /// <param name="localID"></param>
475 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
476 {
477 PrimData PData = new PrimData();
478 this.primData = PData;
479 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
480
481 PData.OwnerID = ownerID;
482 PData.PCode = addPacket.ObjectData.PCode;
483 PData.PathBegin = addPacket.ObjectData.PathBegin;
484 PData.PathEnd = addPacket.ObjectData.PathEnd;
485 PData.PathScaleX = addPacket.ObjectData.PathScaleX;
486 PData.PathScaleY = addPacket.ObjectData.PathScaleY;
487 PData.PathShearX = addPacket.ObjectData.PathShearX;
488 PData.PathShearY = addPacket.ObjectData.PathShearY;
489 PData.PathSkew = addPacket.ObjectData.PathSkew;
490 PData.ProfileBegin = addPacket.ObjectData.ProfileBegin;
491 PData.ProfileEnd = addPacket.ObjectData.ProfileEnd;
492 PData.Scale = addPacket.ObjectData.Scale;
493 PData.PathCurve = addPacket.ObjectData.PathCurve;
494 PData.ProfileCurve = addPacket.ObjectData.ProfileCurve;
495 PData.ParentID = 0;
496 PData.ProfileHollow = addPacket.ObjectData.ProfileHollow;
497 PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
498 PData.PathRevolutions = addPacket.ObjectData.PathRevolutions;
499 PData.PathTaperX = addPacket.ObjectData.PathTaperX;
500 PData.PathTaperY = addPacket.ObjectData.PathTaperY;
501 PData.PathTwist = addPacket.ObjectData.PathTwist;
502 PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
503 LLVector3 pos1 = addPacket.ObjectData.RayEnd;
504 this.primData.FullID = this.uuid = LLUUID.Random();
505 this.primData.LocalID = m_localId = (uint)(localID);
506 this.primData.Position = this.Pos = pos1;
507
508 this.updateFlag = 1;
509 }
510
511 /// <summary>
512 ///
513 /// </summary>
514 /// <param name="data"></param>
515 public void CreateFromBytes(byte[] data)
516 {
517
518 }
519
520 /// <summary>
521 ///
522 /// </summary>
523 /// <param name="primData"></param>
524 public void CreateFromPrimData(PrimData primData)
525 {
526 this.CreateFromPrimData(primData, primData.Position, primData.LocalID, false);
527 }
528
529 /// <summary>
530 ///
531 /// </summary>
532 /// <param name="primData"></param>
533 /// <param name="posi"></param>
534 /// <param name="localID"></param>
535 /// <param name="newprim"></param>
536 public void CreateFromPrimData(PrimData primData, LLVector3 posi, uint localID, bool newprim)
537 {
538
539 }
540
541 public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
542 {
543 // Console.WriteLine("moving prim to new location " + pos.X + " , " + pos.Y + " , " + pos.Z);
544 this.Pos = pos;
545 this.SendTerseUpdateToALLClients();
546 }
547
548 public void GetProperites(IClientAPI client)
549 {
550 //needs changing
551 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
552 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
553 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
554 proper.ObjectData[0].ItemID = LLUUID.Zero;
555 proper.ObjectData[0].CreationDate = (ulong)primData.CreationDate;
556 proper.ObjectData[0].CreatorID = primData.OwnerID;
557 proper.ObjectData[0].FolderID = LLUUID.Zero;
558 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
559 proper.ObjectData[0].GroupID = LLUUID.Zero;
560 proper.ObjectData[0].InventorySerial = 0;
561 proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
562 proper.ObjectData[0].ObjectID = this.uuid;
563 proper.ObjectData[0].OwnerID = primData.OwnerID;
564 proper.ObjectData[0].TouchName = new byte[0];
565 proper.ObjectData[0].TextureID = new byte[0];
566 proper.ObjectData[0].SitName = new byte[0];
567 proper.ObjectData[0].Name = new byte[0];
568 proper.ObjectData[0].Description = new byte[0];
569 proper.ObjectData[0].OwnerMask = primData.OwnerMask;
570 proper.ObjectData[0].NextOwnerMask = primData.NextOwnerMask;
571 proper.ObjectData[0].GroupMask = primData.GroupMask;
572 proper.ObjectData[0].EveryoneMask = primData.EveryoneMask;
573 proper.ObjectData[0].BaseMask = primData.BaseMask;
574
575 client.OutPacket(proper);
576
577 }
578
579 #endregion
580
581 }
582}
diff --git a/OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs
new file mode 100644
index 0000000..d1a2717
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs
@@ -0,0 +1,305 @@
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.Physics.Manager;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36using OpenSim.Framework.Inventory;
37using OpenSim.Framework.Utilities;
38
39namespace OpenSim.Region.Scenes
40{
41 public partial class Scene
42 {
43 /// <summary>
44 /// Modifies terrain using the specified information
45 /// </summary>
46 /// <param name="height">The height at which the user started modifying the terrain</param>
47 /// <param name="seconds">The number of seconds the modify button was pressed</param>
48 /// <param name="brushsize">The size of the brush used</param>
49 /// <param name="action">The action to be performed</param>
50 /// <param name="north">Distance from the north border where the cursor is located</param>
51 /// <param name="west">Distance from the west border where the cursor is located</param>
52 public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west)
53 {
54 // Shiny.
55 double size = (double)(1 << brushsize);
56
57 switch (action)
58 {
59 case 0:
60 // flatten terrain
61 Terrain.flatten(north, west, size, (double)seconds / 100.0);
62 RegenerateTerrain(true, (int)north, (int)west);
63 break;
64 case 1:
65 // raise terrain
66 Terrain.raise(north, west, size, (double)seconds / 100.0);
67 RegenerateTerrain(true, (int)north, (int)west);
68 break;
69 case 2:
70 //lower terrain
71 Terrain.lower(north, west, size, (double)seconds / 100.0);
72 RegenerateTerrain(true, (int)north, (int)west);
73 break;
74 case 3:
75 // smooth terrain
76 Terrain.smooth(north, west, size, (double)seconds / 100.0);
77 RegenerateTerrain(true, (int)north, (int)west);
78 break;
79 case 4:
80 // noise
81 Terrain.noise(north, west, size, (double)seconds / 100.0);
82 RegenerateTerrain(true, (int)north, (int)west);
83 break;
84 case 5:
85 // revert
86 Terrain.revert(north, west, size, (double)seconds / 100.0);
87 RegenerateTerrain(true, (int)north, (int)west);
88 break;
89
90 // CLIENT EXTENSIONS GO HERE
91 case 128:
92 // erode-thermal
93 break;
94 case 129:
95 // erode-aerobic
96 break;
97 case 130:
98 // erode-hydraulic
99 break;
100 }
101 return;
102 }
103
104 /// <summary>
105 ///
106 /// </summary>
107 /// <param name="message"></param>
108 /// <param name="type"></param>
109 /// <param name="fromPos"></param>
110 /// <param name="fromName"></param>
111 /// <param name="fromAgentID"></param>
112 public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
113 {
114 Console.WriteLine("Chat message");
115 ScenePresence avatar = null;
116 foreach (IClientAPI client in m_clientThreads.Values)
117 {
118 int dis = -1000;
119 if (this.Avatars.ContainsKey(client.AgentId))
120 {
121
122 avatar = this.Avatars[client.AgentId];
123 // int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y));
124 dis= (int)avatar.Pos.GetDistanceTo(fromPos);
125 Console.WriteLine("found avatar at " +dis);
126
127 }
128
129 switch (type)
130 {
131 case 0: // Whisper
132 if ((dis < 10) && (dis > -10))
133 {
134 //should change so the message is sent through the avatar rather than direct to the ClientView
135 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
136 }
137 break;
138 case 1: // Say
139 if ((dis < 30) && (dis > -30))
140 {
141 Console.WriteLine("sending chat");
142 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
143 }
144 break;
145 case 2: // Shout
146 if ((dis < 100) && (dis > -100))
147 {
148 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
149 }
150 break;
151
152 case 0xff: // Broadcast
153 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
154 break;
155 }
156
157 }
158 }
159
160 /// <summary>
161 ///
162 /// </summary>
163 /// <param name="primAsset"></param>
164 /// <param name="pos"></param>
165 public void RezObject(AssetBase primAsset, LLVector3 pos)
166 {
167
168 }
169
170 /// <summary>
171 ///
172 /// </summary>
173 /// <param name="packet"></param>
174 /// <param name="simClient"></param>
175 public void DeRezObject(Packet packet, IClientAPI simClient)
176 {
177
178 }
179
180 /// <summary>
181 ///
182 /// </summary>
183 /// <param name="remoteClient"></param>
184 public void SendAvatarsToClient(IClientAPI remoteClient)
185 {
186
187 }
188
189 /// <summary>
190 ///
191 /// </summary>
192 /// <param name="parentPrim"></param>
193 /// <param name="childPrims"></param>
194 public void LinkObjects(uint parentPrim, List<uint> childPrims)
195 {
196
197
198 }
199
200 /// <summary>
201 ///
202 /// </summary>
203 /// <param name="primLocalID"></param>
204 /// <param name="shapeBlock"></param>
205 public void UpdatePrimShape(uint primLocalID, ObjectShapePacket.ObjectDataBlock shapeBlock)
206 {
207
208 }
209
210 /// <summary>
211 ///
212 /// </summary>
213 /// <param name="primLocalID"></param>
214 /// <param name="remoteClient"></param>
215 public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
216 {
217 foreach (Entity ent in Entities.Values)
218 {
219 if (ent.LocalId == primLocalID)
220 {
221 ((OpenSim.Region.Scenes.Primitive)ent).GetProperites(remoteClient);
222 break;
223 }
224 }
225 }
226
227 public void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
228 {
229 if (this.Entities.ContainsKey(objectID))
230 {
231 ((Primitive)this.Entities[objectID]).GrapMovement(offset, pos, remoteClient);
232 }
233 }
234
235 /// <summary>
236 ///
237 /// </summary>
238 /// <param name="localID"></param>
239 /// <param name="packet"></param>
240 /// <param name="remoteClient"></param>
241 public void UpdatePrimFlags(uint localID, Packet packet, IClientAPI remoteClient)
242 {
243
244 }
245
246 /// <summary>
247 ///
248 /// </summary>
249 /// <param name="localID"></param>
250 /// <param name="texture"></param>
251 /// <param name="remoteClient"></param>
252 public void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient)
253 {
254
255 }
256
257 /// <summary>
258 ///
259 /// </summary>
260 /// <param name="localID"></param>
261 /// <param name="pos"></param>
262 /// <param name="remoteClient"></param>
263 public void UpdatePrimPosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
264 {
265 foreach (Entity ent in Entities.Values)
266 {
267 if (ent.LocalId == localID)
268 {
269 ((OpenSim.Region.Scenes.Primitive)ent).UpdatePosition(pos);
270 break;
271 }
272 }
273 }
274
275 /// <summary>
276 ///
277 /// </summary>
278 /// <param name="localID"></param>
279 /// <param name="rot"></param>
280 /// <param name="remoteClient"></param>
281 public void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
282 {
283
284 }
285
286 /// <summary>
287 ///
288 /// </summary>
289 /// <param name="localID"></param>
290 /// <param name="scale"></param>
291 /// <param name="remoteClient"></param>
292 public void UpdatePrimScale(uint localID, LLVector3 scale, IClientAPI remoteClient)
293 {
294 }
295
296 /// <summary>
297 /// Sends prims to a client
298 /// </summary>
299 /// <param name="RemoteClient">Client to send to</param>
300 public void GetInitialPrims(IClientAPI RemoteClient)
301 {
302
303 }
304 }
305}
diff --git a/OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs b/OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs
new file mode 100644
index 0000000..7b53388
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs
@@ -0,0 +1,184 @@
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.Reflection;
33using OpenSim.Framework;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36using libsecondlife;
37
38namespace OpenSim.Region.Scenes
39{
40 public partial class Scene
41 {
42 private Dictionary<string, IScriptEngine> scriptEngines = new Dictionary<string, IScriptEngine>();
43
44 /// <summary>
45 ///
46 /// </summary>
47 private void LoadScriptEngines()
48 {
49 this.LoadScriptPlugins();
50 }
51
52 /// <summary>
53 ///
54 /// </summary>
55 public void LoadScriptPlugins()
56 {
57 string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "ScriptEngines");
58 string[] pluginFiles = Directory.GetFiles(path, "*.dll");
59
60
61 for (int i = 0; i < pluginFiles.Length; i++)
62 {
63 this.AddPlugin(pluginFiles[i]);
64 }
65 }
66
67 /// <summary>
68 ///
69 /// </summary>
70 /// <param name="FileName"></param>
71 private void AddPlugin(string FileName)
72 {
73 Assembly pluginAssembly = Assembly.LoadFrom(FileName);
74
75 foreach (Type pluginType in pluginAssembly.GetTypes())
76 {
77 if (pluginType.IsPublic)
78 {
79 if (!pluginType.IsAbstract)
80 {
81 Type typeInterface = pluginType.GetInterface("IScriptEngine", true);
82
83 if (typeInterface != null)
84 {
85 IScriptEngine plug = (IScriptEngine)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
86 plug.Init(this);
87 this.scriptEngines.Add(plug.GetName(), plug);
88
89 }
90
91 typeInterface = null;
92 }
93 }
94 }
95
96 pluginAssembly = null;
97 }
98
99 /// <summary>
100 ///
101 /// </summary>
102 /// <param name="scriptType"></param>
103 /// <param name="scriptName"></param>
104 /// <param name="script"></param>
105 /// <param name="ent"></param>
106 public void LoadScript(string scriptType, string scriptName, string script, Entity ent)
107 {
108 if(this.scriptEngines.ContainsKey(scriptType))
109 {
110 this.scriptEngines[scriptType].LoadScript(script, scriptName, ent.LocalId);
111 }
112 }
113
114 #region IScriptAPI Methods
115
116 /// <summary>
117 ///
118 /// </summary>
119 /// <param name="localID"></param>
120 /// <returns></returns>
121 public LLVector3 GetEntityPosition(uint localID)
122 {
123 LLVector3 res = new LLVector3();
124 // Console.WriteLine("script- getting entity " + localID + " position");
125 foreach (Entity entity in this.Entities.Values)
126 {
127 if (entity.LocalId == localID)
128 {
129 res.X = entity.Pos.X;
130 res.Y = entity.Pos.Y;
131 res.Z = entity.Pos.Z;
132 }
133 }
134 return res;
135 }
136
137 /// <summary>
138 ///
139 /// </summary>
140 /// <param name="localID"></param>
141 /// <param name="x"></param>
142 /// <param name="y"></param>
143 /// <param name="z"></param>
144 public void SetEntityPosition(uint localID, float x , float y, float z)
145 {
146 foreach (Entity entity in this.Entities.Values)
147 {
148 if (entity.LocalId == localID && entity is Primitive)
149 {
150 LLVector3 pos = entity.Pos;
151 pos.X = x;
152 pos.Y = y;
153 Primitive prim = entity as Primitive;
154 // Of course, we really should have asked the physEngine if this is possible, and if not, returned false.
155 //prim.UpdatePosition(pos);
156 // Console.WriteLine("script- setting entity " + localID + " positon");
157 }
158 }
159
160 }
161
162 /// <summary>
163 ///
164 /// </summary>
165 /// <returns></returns>
166 public uint GetRandomAvatarID()
167 {
168 //Console.WriteLine("script- getting random avatar id");
169 uint res = 0;
170 foreach (Entity entity in this.Entities.Values)
171 {
172 if (entity is ScenePresence)
173 {
174 res = entity.LocalId;
175 }
176 }
177 return res;
178 }
179
180 #endregion
181
182
183 }
184}
diff --git a/OpenSim/Region/Simulation/Scenes/Scene.cs b/OpenSim/Region/Simulation/Scenes/Scene.cs
new file mode 100644
index 0000000..bf2244e
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Scene.cs
@@ -0,0 +1,795 @@
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 libsecondlife.Packets;
31using System.Collections.Generic;
32using System.Text;
33using System.Reflection;
34using System.IO;
35using System.Threading;
36using System.Timers;
37using OpenSim.Physics.Manager;
38using OpenSim.Framework.Interfaces;
39using OpenSim.Framework.Types;
40using OpenSim.Framework.Inventory;
41using OpenSim.Framework;
42using OpenSim.Region.Scripting;
43using OpenSim.Terrain;
44using OpenGrid.Framework.Communications;
45using OpenSim.Caches;
46using OpenSim.Region;
47using OpenSim.Servers;
48
49namespace OpenSim.Region.Scenes
50{
51 public delegate bool FilterAvatarList(ScenePresence avatar);
52
53 public partial class Scene : SceneBase, ILocalStorageReceiver, IScriptAPI
54 {
55 protected System.Timers.Timer m_heartbeatTimer = new System.Timers.Timer();
56 protected Dictionary<libsecondlife.LLUUID, ScenePresence> Avatars;
57 protected Dictionary<libsecondlife.LLUUID, Primitive> Prims;
58 private PhysicsScene phyScene;
59 private float timeStep = 0.1f;
60 private Random Rand = new Random();
61 private uint _primCount = 702000;
62 private int storageCount;
63 private Dictionary<LLUUID, ScriptHandler> m_scriptHandlers;
64 private Dictionary<string, ScriptFactory> m_scripts;
65 private Mutex updateLock;
66
67 protected AuthenticateSessionsBase authenticateHandler;
68 protected RegionCommsListener regionCommsHost;
69 protected CommunicationsManager commsManager;
70
71 protected Dictionary<LLUUID, Caps> capsHandlers = new Dictionary<LLUUID, Caps>();
72 protected BaseHttpServer httpListener;
73
74 public ParcelManager parcelManager;
75 public EstateManager estateManager;
76 public EventManager eventManager;
77
78 #region Properties
79 /// <summary>
80 ///
81 /// </summary>
82 public PhysicsScene PhysScene
83 {
84 set
85 {
86 this.phyScene = value;
87 }
88 get
89 {
90 return (this.phyScene);
91 }
92 }
93
94 #endregion
95
96 #region Constructors
97 /// <summary>
98 /// Creates a new World class, and a region to go with it.
99 /// </summary>
100 /// <param name="clientThreads">Dictionary to contain client threads</param>
101 /// <param name="regionHandle">Region Handle for this region</param>
102 /// <param name="regionName">Region Name for this region</param>
103 public Scene(Dictionary<uint, IClientAPI> clientThreads, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer)
104 {
105 try
106 {
107 updateLock = new Mutex(false);
108 this.authenticateHandler = authen;
109 this.commsManager = commsMan;
110 this.assetCache = assetCach;
111 m_clientThreads = clientThreads;
112 m_regInfo = regInfo;
113 m_regionHandle = m_regInfo.RegionHandle;
114 m_regionName = m_regInfo.RegionName;
115 this.m_datastore = m_regInfo.DataStore;
116 this.RegisterRegionWithComms();
117
118 parcelManager = new ParcelManager(this, this.m_regInfo);
119 estateManager = new EstateManager(this, this.m_regInfo);
120
121 eventManager = new EventManager();
122
123 m_scriptHandlers = new Dictionary<LLUUID, ScriptHandler>();
124 m_scripts = new Dictionary<string, ScriptFactory>();
125
126 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs - creating new entitities instance");
127 Entities = new Dictionary<libsecondlife.LLUUID, Entity>();
128 Avatars = new Dictionary<LLUUID, ScenePresence>();
129 Prims = new Dictionary<LLUUID, Primitive>();
130
131 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs - creating LandMap");
132 Terrain = new TerrainEngine();
133
134 ScenePresence.LoadAnims();
135 this.httpListener = httpServer;
136
137 }
138 catch (Exception e)
139 {
140 OpenSim.Framework.Console.MainLog.Instance.Error( "World.cs: Constructor failed with exception " + e.ToString());
141 }
142 }
143 #endregion
144
145 /// <summary>
146 ///
147 /// </summary>
148 public void StartTimer()
149 {
150 m_heartbeatTimer.Enabled = true;
151 m_heartbeatTimer.Interval = 100;
152 m_heartbeatTimer.Elapsed += new ElapsedEventHandler(this.Heartbeat);
153 }
154
155
156 #region Update Methods
157
158
159 /// <summary>
160 /// Performs per-frame updates regularly
161 /// </summary>
162 /// <param name="sender"></param>
163 /// <param name="e"></param>
164 void Heartbeat(object sender, System.EventArgs e)
165 {
166 this.Update();
167 }
168
169 /// <summary>
170 /// Performs per-frame updates on the world, this should be the central world loop
171 /// </summary>
172 public override void Update()
173 {
174 updateLock.WaitOne();
175 try
176 {
177 if (this.phyScene.IsThreaded)
178 {
179 this.phyScene.GetResults();
180
181 }
182
183 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
184 {
185 Entities[UUID].updateMovement();
186 }
187
188 lock (this.m_syncRoot)
189 {
190 this.phyScene.Simulate(timeStep);
191 }
192
193 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
194 {
195 Entities[UUID].update();
196 }
197
198 // New
199 eventManager.TriggerOnFrame();
200
201 // TODO: Obsolete - Phase out
202 foreach (ScriptHandler scriptHandler in m_scriptHandlers.Values)
203 {
204 scriptHandler.OnFrame();
205 }
206 foreach (IScriptEngine scripteng in this.scriptEngines.Values)
207 {
208 scripteng.OnFrame();
209 }
210
211 //backup world data
212 this.storageCount++;
213 if (storageCount > 1200) //set to how often you want to backup
214 {
215 this.Backup();
216 storageCount = 0;
217 }
218 }
219 catch (Exception e)
220 {
221 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: Update() - Failed with exception " + e.ToString());
222 }
223 updateLock.ReleaseMutex();
224
225 }
226
227 /// <summary>
228 ///
229 /// </summary>
230 /// <returns></returns>
231 public bool Backup()
232 {
233 /*
234 try
235 {
236 // Terrain backup routines
237 if (Terrain.tainted > 0)
238 {
239 Terrain.tainted = 0;
240 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Terrain tainted, saving.");
241 localStorage.SaveMap(Terrain.getHeights1D());
242 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Terrain saved, informing Physics.");
243 lock (this.m_syncRoot)
244 {
245 phyScene.SetTerrain(Terrain.getHeights1D());
246 }
247 }
248
249 // Primitive backup routines
250 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Backing up Primitives");
251 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
252 {
253 Entities[UUID].BackUp();
254 }
255
256 //Parcel backup routines
257 ParcelData[] parcels = new ParcelData[parcelManager.parcelList.Count];
258 int i = 0;
259 foreach (OpenSim.Region.Parcel parcel in parcelManager.parcelList.Values)
260 {
261 parcels[i] = parcel.parcelData;
262 i++;
263 }
264 localStorage.SaveParcels(parcels);
265
266 // Backup successful
267 return true;
268 }
269 catch (Exception e)
270 {
271 // Backup failed
272 OpenSim.Framework.Console.MainLog.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Backup() - Backup Failed with exception " + e.ToString());
273 return false;
274 }
275 */
276 return true;
277 }
278 #endregion
279
280 #region Regenerate Terrain
281
282 /// <summary>
283 /// Rebuilds the terrain using a procedural algorithm
284 /// </summary>
285 public void RegenerateTerrain()
286 {
287 try
288 {
289 Terrain.hills();
290
291 lock (this.m_syncRoot)
292 {
293 this.phyScene.SetTerrain(Terrain.getHeights1D());
294 }
295 this.localStorage.SaveMap(this.Terrain.getHeights1D());
296
297 foreach (IClientAPI client in m_clientThreads.Values)
298 {
299 this.SendLayerData(client);
300 }
301
302 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
303 {
304 Entities[UUID].LandRenegerated();
305 }
306 }
307 catch (Exception e)
308 {
309 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
310 }
311 }
312
313 /// <summary>
314 /// Rebuilds the terrain using a 2D float array
315 /// </summary>
316 /// <param name="newMap">256,256 float array containing heights</param>
317 public void RegenerateTerrain(float[,] newMap)
318 {
319 try
320 {
321 this.Terrain.setHeights2D(newMap);
322 lock (this.m_syncRoot)
323 {
324 this.phyScene.SetTerrain(this.Terrain.getHeights1D());
325 }
326 this.localStorage.SaveMap(this.Terrain.getHeights1D());
327
328 foreach (IClientAPI client in m_clientThreads.Values)
329 {
330 this.SendLayerData(client);
331 }
332
333 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
334 {
335 Entities[UUID].LandRenegerated();
336 }
337 }
338 catch (Exception e)
339 {
340 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
341 }
342 }
343
344 /// <summary>
345 /// Rebuilds the terrain assuming changes occured at a specified point[?]
346 /// </summary>
347 /// <param name="changes">???</param>
348 /// <param name="pointx">???</param>
349 /// <param name="pointy">???</param>
350 public void RegenerateTerrain(bool changes, int pointx, int pointy)
351 {
352 try
353 {
354 if (changes)
355 {
356 /* Dont save here, rely on tainting system instead */
357
358 foreach (IClientAPI client in m_clientThreads.Values)
359 {
360 this.SendLayerData(pointx, pointy, client);
361 }
362 }
363 }
364 catch (Exception e)
365 {
366 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
367 }
368 }
369
370 #endregion
371
372 #region Load Terrain
373 /// <summary>
374 /// Loads the World heightmap
375 /// </summary>
376 ///
377 public override void LoadWorldMap()
378 {
379 try
380 {
381 float[] map = this.localStorage.LoadWorld();
382 if (map == null)
383 {
384 if (string.IsNullOrEmpty(this.m_regInfo.estateSettings.terrainFile))
385 {
386 Console.WriteLine("No default terrain, procedurally generating...");
387 this.Terrain.hills();
388
389 this.localStorage.SaveMap(this.Terrain.getHeights1D());
390 }
391 else
392 {
393 try
394 {
395 this.Terrain.loadFromFileF32(this.m_regInfo.estateSettings.terrainFile);
396 this.Terrain *= this.m_regInfo.estateSettings.terrainMultiplier;
397 }
398 catch
399 {
400 Console.WriteLine("Unable to load default terrain, procedurally generating instead...");
401 Terrain.hills();
402 }
403 this.localStorage.SaveMap(this.Terrain.getHeights1D());
404 }
405 }
406 else
407 {
408 this.Terrain.setHeights1D(map);
409 }
410
411 CreateTerrainTexture();
412
413 }
414 catch (Exception e)
415 {
416 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadWorldMap() - Failed with exception " + e.ToString());
417 }
418 }
419
420 /// <summary>
421 ///
422 /// </summary>
423 private void CreateTerrainTexture()
424 {
425 //create a texture asset of the terrain
426 byte[] data = this.Terrain.exportJpegImage("defaultstripe.png");
427 this.m_regInfo.estateSettings.terrainImageID = LLUUID.Random();
428 AssetBase asset = new AssetBase();
429 asset.FullID = this.m_regInfo.estateSettings.terrainImageID;
430 asset.Data = data;
431 asset.Name = "terrainImage";
432 asset.Type = 0;
433 this.assetCache.AddAsset(asset);
434 }
435 #endregion
436
437 #region Primitives Methods
438
439
440 /// <summary>
441 /// Loads the World's objects
442 /// </summary>
443 public void LoadPrimsFromStorage()
444 {
445 try
446 {
447 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: LoadPrimsFromStorage() - Loading primitives");
448 this.localStorage.LoadPrimitives(this);
449 }
450 catch (Exception e)
451 {
452 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadPrimsFromStorage() - Failed with exception " + e.ToString());
453 }
454 }
455
456 /// <summary>
457 /// Loads a specific object from storage
458 /// </summary>
459 /// <param name="prim">The object to load</param>
460 public void PrimFromStorage(PrimData prim)
461 {
462
463 }
464
465 /// <summary>
466 ///
467 /// </summary>
468 /// <param name="addPacket"></param>
469 /// <param name="agentClient"></param>
470 public void AddNewPrim(Packet addPacket, IClientAPI agentClient)
471 {
472 AddNewPrim((ObjectAddPacket)addPacket, agentClient.AgentId);
473 }
474
475 /// <summary>
476 ///
477 /// </summary>
478 /// <param name="addPacket"></param>
479 /// <param name="ownerID"></param>
480 public void AddNewPrim(ObjectAddPacket addPacket, LLUUID ownerID)
481 {
482 try
483 {
484 Primitive prim = new Primitive(m_regionHandle, this, addPacket, ownerID, this._primCount);
485
486 this.Entities.Add(prim.uuid, prim);
487 this._primCount++;
488
489 // Trigger event for listeners
490 eventManager.TriggerOnNewPrimitive(prim);
491 }
492 catch (Exception e)
493 {
494 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: AddNewPrim() - Failed with exception " + e.ToString());
495 }
496 }
497
498 #endregion
499
500 #region Add/Remove Avatar Methods
501
502 /// <summary>
503 ///
504 /// </summary>
505 /// <param name="remoteClient"></param
506 /// <param name="agentID"></param>
507 /// <param name="child"></param>
508 public override void AddNewClient(IClientAPI remoteClient, LLUUID agentID, bool child)
509 {
510 remoteClient.OnRegionHandShakeReply += this.SendLayerData;
511 //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims);
512 remoteClient.OnChatFromViewer += this.SimChat;
513 remoteClient.OnRequestWearables += this.InformClientOfNeighbours;
514 remoteClient.OnAddPrim += this.AddNewPrim;
515 remoteClient.OnUpdatePrimPosition += this.UpdatePrimPosition;
516 remoteClient.OnRequestMapBlocks += this.RequestMapBlocks;
517 remoteClient.OnTeleportLocationRequest += this.RequestTeleportLocation;
518 //remoteClient.OnObjectSelect += this.SelectPrim;
519 remoteClient.OnGrapUpdate += this.MoveObject;
520
521 /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
522 remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest);
523 remoteClient.OnParcelJoinRequest += new ParcelJoinRequest(parcelManager.handleParcelJoinRequest);
524 remoteClient.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(parcelManager.handleParcelPropertiesUpdateRequest);
525 remoteClient.OnEstateOwnerMessage += new EstateOwnerMessageRequest(estateManager.handleEstateOwnerMessage);
526 */
527
528 ScenePresence newAvatar = null;
529 try
530 {
531
532 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent");
533 newAvatar = new ScenePresence(remoteClient, this, this.m_regInfo);
534 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Adding new avatar to world");
535 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Starting RegionHandshake ");
536
537 //newAvatar.SendRegionHandshake();
538 this.estateManager.sendRegionHandshake(remoteClient);
539
540 PhysicsVector pVec = new PhysicsVector(newAvatar.Pos.X, newAvatar.Pos.Y, newAvatar.Pos.Z);
541 lock (this.m_syncRoot)
542 {
543 newAvatar.PhysActor = this.phyScene.AddAvatar(pVec);
544 }
545
546 lock (Entities)
547 {
548 if (!Entities.ContainsKey(agentID))
549 {
550 this.Entities.Add(agentID, newAvatar);
551 }
552 else
553 {
554 Entities[agentID] = newAvatar;
555 }
556 }
557 lock (Avatars)
558 {
559 if (Avatars.ContainsKey(agentID))
560 {
561 Avatars[agentID] = newAvatar;
562 }
563 else
564 {
565 this.Avatars.Add(agentID, newAvatar);
566 }
567 }
568 }
569 catch (Exception e)
570 {
571 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: AddViewerAgent() - Failed with exception " + e.ToString());
572 }
573 return;
574 }
575
576
577
578 /// <summary>
579 ///
580 /// </summary>
581 /// <param name="agentID"></param>
582 public override void RemoveClient(LLUUID agentID)
583 {
584 eventManager.TriggerOnRemovePresence(agentID);
585
586 return;
587 }
588 #endregion
589
590 #region Request Avatars List Methods
591 //The idea is to have a group of method that return a list of avatars meeting some requirement
592 // ie it could be all Avatars within a certain range of the calling prim/avatar.
593
594 /// <summary>
595 /// Request a List of all Avatars in this World
596 /// </summary>
597 /// <returns></returns>
598 public List<ScenePresence> RequestAvatarList()
599 {
600 List<ScenePresence> result = new List<ScenePresence>();
601
602 foreach (ScenePresence avatar in Avatars.Values)
603 {
604 result.Add(avatar);
605 }
606
607 return result;
608 }
609
610 /// <summary>
611 /// Request a filtered list of Avatars in this World
612 /// </summary>
613 /// <returns></returns>
614 public List<ScenePresence> RequestAvatarList(FilterAvatarList filter)
615 {
616 List<ScenePresence> result = new List<ScenePresence>();
617
618 foreach (ScenePresence avatar in Avatars.Values)
619 {
620 if (filter(avatar))
621 {
622 result.Add(avatar);
623 }
624 }
625
626 return result;
627 }
628
629 /// <summary>
630 /// Request a Avatar by UUID
631 /// </summary>
632 /// <param name="avatarID"></param>
633 /// <returns></returns>
634 public ScenePresence RequestAvatar(LLUUID avatarID)
635 {
636 if (this.Avatars.ContainsKey(avatarID))
637 {
638 return Avatars[avatarID];
639 }
640 return null;
641 }
642 #endregion
643
644
645 #region RegionCommsHost
646
647 /// <summary>
648 ///
649 /// </summary>
650 public void RegisterRegionWithComms()
651 {
652 GridInfo gridSettings = new GridInfo();
653 this.regionCommsHost = this.commsManager.GridServer.RegisterRegion(this.m_regInfo,gridSettings);
654 if (this.regionCommsHost != null)
655 {
656 this.regionCommsHost.OnExpectUser += new ExpectUserDelegate(this.NewUserConnection);
657 this.regionCommsHost.OnAvatarCrossingIntoRegion += new AgentCrossing(this.AgentCrossing);
658 }
659 }
660
661 /// <summary>
662 ///
663 /// </summary>
664 /// <param name="regionHandle"></param>
665 /// <param name="agent"></param>
666 public void NewUserConnection(ulong regionHandle, AgentCircuitData agent)
667 {
668 // Console.WriteLine("World.cs - add new user connection");
669 //should just check that its meant for this region
670 if (regionHandle == this.m_regInfo.RegionHandle)
671 {
672 if (agent.CapsPath != "")
673 {
674 //Console.WriteLine("new user, so creating caps handler for it");
675 Caps cap = new Caps(this.assetCache, httpListener, this.m_regInfo.CommsIPListenAddr, 9000, agent.CapsPath, agent.AgentID);
676 cap.RegisterHandlers();
677 this.capsHandlers.Add(agent.AgentID, cap);
678 }
679 this.authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
680 }
681 }
682
683 public void AgentCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position)
684 {
685 if (regionHandle == this.m_regInfo.RegionHandle)
686 {
687 if (this.Avatars.ContainsKey(agentID))
688 {
689 this.Avatars[agentID].MakeAvatar(position);
690 }
691 }
692 }
693
694 /// <summary>
695 ///
696 /// </summary>
697 public void InformClientOfNeighbours(IClientAPI remoteClient)
698 {
699 // Console.WriteLine("informing client of neighbouring regions");
700 List<RegionInfo> neighbours = this.commsManager.GridServer.RequestNeighbours(this.m_regInfo);
701
702 //Console.WriteLine("we have " + neighbours.Count + " neighbouring regions");
703 if (neighbours != null)
704 {
705 for (int i = 0; i < neighbours.Count; i++)
706 {
707 // Console.WriteLine("sending neighbours data");
708 AgentCircuitData agent = remoteClient.RequestClientInfo();
709 agent.BaseFolder = LLUUID.Zero;
710 agent.InventoryFolder = LLUUID.Zero;
711 agent.startpos = new LLVector3(128, 128, 70);
712 agent.child = true;
713 this.commsManager.InterRegion.InformRegionOfChildAgent(neighbours[i].RegionHandle, agent);
714 remoteClient.InformClientOfNeighbour(neighbours[i].RegionHandle, System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr), (ushort)neighbours[i].CommsIPListenPort);
715 //this.capsHandlers[remoteClient.AgentId].CreateEstablishAgentComms("", System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr) + ":" + neighbours[i].CommsIPListenPort);
716 }
717 }
718 }
719
720 /// <summary>
721 ///
722 /// </summary>
723 /// <param name="regionHandle"></param>
724 /// <returns></returns>
725 public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle)
726 {
727 return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle);
728 }
729
730 /// <summary>
731 ///
732 /// </summary>
733 /// <param name="minX"></param>
734 /// <param name="minY"></param>
735 /// <param name="maxX"></param>
736 /// <param name="maxY"></param>
737 public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY)
738 {
739 List<MapBlockData> mapBlocks;
740 mapBlocks = this.commsManager.GridServer.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
741 remoteClient.SendMapBlock(mapBlocks);
742 }
743
744 /// <summary>
745 ///
746 /// </summary>
747 /// <param name="remoteClient"></param>
748 /// <param name="RegionHandle"></param>
749 /// <param name="position"></param>
750 /// <param name="lookAt"></param>
751 /// <param name="flags"></param>
752 public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags)
753 {
754 if (regionHandle == this.m_regionHandle)
755 {
756 if (this.Avatars.ContainsKey(remoteClient.AgentId))
757 {
758 remoteClient.SendTeleportLocationStart();
759 remoteClient.SendLocalTeleport(position, lookAt, flags);
760 this.Avatars[remoteClient.AgentId].Teleport(position);
761 }
762 }
763 else
764 {
765 RegionInfo reg = this.RequestNeighbouringRegionInfo(regionHandle);
766 if (reg != null)
767 {
768 remoteClient.SendTeleportLocationStart();
769 AgentCircuitData agent = remoteClient.RequestClientInfo();
770 agent.BaseFolder = LLUUID.Zero;
771 agent.InventoryFolder = LLUUID.Zero;
772 agent.startpos = new LLVector3(128, 128, 70);
773 agent.child = true;
774 this.commsManager.InterRegion.InformRegionOfChildAgent(regionHandle, agent);
775 this.commsManager.InterRegion.ExpectAvatarCrossing(regionHandle, remoteClient.AgentId, position);
776 remoteClient.SendRegionTeleport(regionHandle, 13, reg.CommsIPListenAddr, (ushort)reg.CommsIPListenPort, 4, (1 << 4));
777 }
778 //remoteClient.SendTeleportCancel();
779 }
780 }
781
782 /// <summary>
783 ///
784 /// </summary>
785 /// <param name="regionhandle"></param>
786 /// <param name="agentID"></param>
787 /// <param name="position"></param>
788 public bool InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position)
789 {
790 return this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position);
791 }
792
793 #endregion
794 }
795}
diff --git a/OpenSim/Region/Simulation/Scenes/SceneBase.cs b/OpenSim/Region/Simulation/Scenes/SceneBase.cs
new file mode 100644
index 0000000..4dbd374
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/SceneBase.cs
@@ -0,0 +1,201 @@
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 libsecondlife.Packets;
31using System.Collections.Generic;
32using System.Text;
33using System.Reflection;
34using System.IO;
35using System.Threading;
36using OpenSim.Physics.Manager;
37using OpenSim.Framework.Interfaces;
38using OpenSim.Framework.Types;
39using OpenSim.Framework.Inventory;
40using OpenSim.Region.Scripting;
41using OpenSim.Terrain;
42using OpenSim.Caches;
43
44namespace OpenSim.Region.Scenes
45{
46 public abstract class SceneBase : IWorld
47 {
48 public Dictionary<libsecondlife.LLUUID, Entity> Entities;
49 protected Dictionary<uint, IClientAPI> m_clientThreads;
50 protected ulong m_regionHandle;
51 protected string m_regionName;
52 protected RegionInfo m_regInfo;
53
54 public TerrainEngine Terrain;
55
56 public string m_datastore;
57 public ILocalStorage localStorage;
58
59 protected object m_syncRoot = new object();
60 private uint m_nextLocalId = 8880000;
61 protected AssetCache assetCache;
62
63 #region Update Methods
64 /// <summary>
65 /// Normally called once every frame/tick to let the world preform anything required (like running the physics simulation)
66 /// </summary>
67 public abstract void Update();
68
69 #endregion
70
71 #region Terrain Methods
72
73 /// <summary>
74 /// Loads the World heightmap
75 /// </summary>
76 public abstract void LoadWorldMap();
77
78 /// <summary>
79 /// Loads a new storage subsystem from a named library
80 /// </summary>
81 /// <param name="dllName">Storage Library</param>
82 /// <returns>Successful or not</returns>
83 public bool LoadStorageDLL(string dllName)
84 {
85 try
86 {
87 Assembly pluginAssembly = Assembly.LoadFrom(dllName);
88 ILocalStorage store = null;
89
90 foreach (Type pluginType in pluginAssembly.GetTypes())
91 {
92 if (pluginType.IsPublic)
93 {
94 if (!pluginType.IsAbstract)
95 {
96 Type typeInterface = pluginType.GetInterface("ILocalStorage", true);
97
98 if (typeInterface != null)
99 {
100 ILocalStorage plug = (ILocalStorage)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
101 store = plug;
102
103 store.Initialise(this.m_datastore);
104 break;
105 }
106
107 typeInterface = null;
108 }
109 }
110 }
111 pluginAssembly = null;
112 this.localStorage = store;
113 return (store == null);
114 }
115 catch (Exception e)
116 {
117 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadStorageDLL() - Failed with exception " + e.ToString());
118 return false;
119 }
120 }
121
122
123 /// <summary>
124 /// Send the region heightmap to the client
125 /// </summary>
126 /// <param name="RemoteClient">Client to send to</param>
127 public virtual void SendLayerData(IClientAPI RemoteClient)
128 {
129 RemoteClient.SendLayerData(Terrain.getHeights1D());
130 }
131
132 /// <summary>
133 /// Sends a specified patch to a client
134 /// </summary>
135 /// <param name="px">Patch coordinate (x) 0..16</param>
136 /// <param name="py">Patch coordinate (y) 0..16</param>
137 /// <param name="RemoteClient">The client to send to</param>
138 public virtual void SendLayerData(int px, int py, IClientAPI RemoteClient)
139 {
140 RemoteClient.SendLayerData(px, py, Terrain.getHeights1D());
141 }
142
143 #endregion
144
145 #region Add/Remove Agent/Avatar
146 /// <summary>
147 ///
148 /// </summary>
149 /// <param name="remoteClient"></param>
150 /// <param name="agentID"></param>
151 /// <param name="child"></param>
152 public abstract void AddNewClient(IClientAPI remoteClient, LLUUID agentID, bool child);
153
154 /// <summary>
155 ///
156 /// </summary>
157 /// <param name="agentID"></param>
158 public abstract void RemoveClient(LLUUID agentID);
159
160 #endregion
161
162 /// <summary>
163 ///
164 /// </summary>
165 /// <returns></returns>
166 public virtual RegionInfo RegionInfo
167 {
168 get { return this.m_regInfo; }
169 }
170
171 public object SyncRoot
172 {
173 get { return m_syncRoot; }
174 }
175
176 public uint NextLocalId
177 {
178 get { return m_nextLocalId++; }
179 }
180
181 #region Shutdown
182 /// <summary>
183 /// Tidy before shutdown
184 /// </summary>
185 public virtual void Close()
186 {
187 try
188 {
189 this.localStorage.ShutDown();
190 }
191 catch (Exception e)
192 {
193 OpenSim.Framework.Console.MainLog.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Close() - Failed with exception " + e.ToString());
194 }
195 }
196
197 #endregion
198
199
200 }
201}
diff --git a/OpenSim/Region/Simulation/Scenes/SceneEvents.cs b/OpenSim/Region/Simulation/Scenes/SceneEvents.cs
new file mode 100644
index 0000000..2898578
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/SceneEvents.cs
@@ -0,0 +1,52 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Region.Scenes
6{
7 /// <summary>
8 /// A class for triggering remote scene events.
9 /// </summary>
10 public class EventManager
11 {
12 public delegate void OnFrameDelegate();
13 public event OnFrameDelegate OnFrame;
14
15 public delegate void OnNewPresenceDelegate(ScenePresence presence);
16 public event OnNewPresenceDelegate OnNewPresence;
17
18 public delegate void OnNewPrimitiveDelegate(Primitive prim);
19 public event OnNewPrimitiveDelegate OnNewPrimitive;
20
21 public delegate void OnRemovePresenceDelegate(libsecondlife.LLUUID uuid);
22 public event OnRemovePresenceDelegate OnRemovePresence;
23
24 public void TriggerOnFrame()
25 {
26 if (OnFrame != null)
27 {
28 OnFrame();
29 }
30 }
31
32 public void TriggerOnNewPrimitive(Primitive prim)
33 {
34 if (OnNewPrimitive != null)
35 OnNewPrimitive(prim);
36 }
37
38 public void TriggerOnNewPresence(ScenePresence presence)
39 {
40 if (OnNewPresence != null)
41 OnNewPresence(presence);
42 }
43
44 public void TriggerOnRemovePresence(libsecondlife.LLUUID uuid)
45 {
46 if (OnRemovePresence != null)
47 {
48 OnRemovePresence(uuid);
49 }
50 }
51 }
52}
diff --git a/OpenSim/Region/Simulation/Scenes/SceneObject.cs b/OpenSim/Region/Simulation/Scenes/SceneObject.cs
new file mode 100644
index 0000000..5df87bf
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/SceneObject.cs
@@ -0,0 +1,128 @@
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.Interfaces;
34using OpenSim.Physics.Manager;
35using OpenSim.Framework.Types;
36using OpenSim.Framework.Inventory;
37
38namespace OpenSim.Region.Scenes
39{
40 public class SceneObject : Entity
41 {
42 private LLUUID rootUUID;
43 //private Dictionary<LLUUID, Primitive> ChildPrimitives = new Dictionary<LLUUID, Primitive>();
44 protected Primitive rootPrimitive;
45 private Scene m_world;
46 protected ulong regionHandle;
47
48 /// <summary>
49 ///
50 /// </summary>
51 public SceneObject()
52 {
53
54 }
55
56 /// <summary>
57 ///
58 /// </summary>
59 /// <param name="addPacket"></param>
60 /// <param name="agentID"></param>
61 /// <param name="localID"></param>
62 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID agentID, uint localID)
63 {
64 this.rootPrimitive = new Primitive( this.regionHandle, this.m_world, addPacket, agentID, localID);
65 }
66
67 /// <summary>
68 ///
69 /// </summary>
70 /// <param name="data"></param>
71 public void CreateFromBytes(byte[] data)
72 {
73
74 }
75
76 /// <summary>
77 ///
78 /// </summary>
79 public override void update()
80 {
81
82 }
83
84 /// <summary>
85 ///
86 /// </summary>
87 public override void BackUp()
88 {
89
90 }
91
92 /// <summary>
93 ///
94 /// </summary>
95 /// <param name="client"></param>
96 public void GetProperites(IClientAPI client)
97 {
98 //needs changing
99 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
100 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
101 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
102 proper.ObjectData[0].ItemID = LLUUID.Zero;
103 proper.ObjectData[0].CreationDate = (ulong)this.rootPrimitive.primData.CreationDate;
104 proper.ObjectData[0].CreatorID = this.rootPrimitive.primData.OwnerID;
105 proper.ObjectData[0].FolderID = LLUUID.Zero;
106 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
107 proper.ObjectData[0].GroupID = LLUUID.Zero;
108 proper.ObjectData[0].InventorySerial = 0;
109 proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
110 proper.ObjectData[0].ObjectID = this.uuid;
111 proper.ObjectData[0].OwnerID = this.rootPrimitive.primData.OwnerID;
112 proper.ObjectData[0].TouchName = new byte[0];
113 proper.ObjectData[0].TextureID = new byte[0];
114 proper.ObjectData[0].SitName = new byte[0];
115 proper.ObjectData[0].Name = new byte[0];
116 proper.ObjectData[0].Description = new byte[0];
117 proper.ObjectData[0].OwnerMask = this.rootPrimitive.primData.OwnerMask;
118 proper.ObjectData[0].NextOwnerMask = this.rootPrimitive.primData.NextOwnerMask;
119 proper.ObjectData[0].GroupMask = this.rootPrimitive.primData.GroupMask;
120 proper.ObjectData[0].EveryoneMask = this.rootPrimitive.primData.EveryoneMask;
121 proper.ObjectData[0].BaseMask = this.rootPrimitive.primData.BaseMask;
122
123 client.OutPacket(proper);
124
125 }
126
127 }
128}
diff --git a/OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs b/OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs
new file mode 100644
index 0000000..f0a8721
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs
@@ -0,0 +1,76 @@
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 System.Xml;
33
34namespace OpenSim.Region.Scenes
35{
36 partial class ScenePresence
37 {
38 public class AvatarAnimations
39 {
40
41 public Dictionary<string, LLUUID> AnimsLLUUID = new Dictionary<string, LLUUID>();
42 public Dictionary<LLUUID, string> AnimsNames = new Dictionary<LLUUID, string>();
43
44 public AvatarAnimations()
45 {
46 }
47
48 public void LoadAnims()
49 {
50 //OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs:LoadAnims() - Loading avatar animations");
51 XmlTextReader reader = new XmlTextReader("data/avataranimations.xml");
52
53 XmlDocument doc = new XmlDocument();
54 doc.Load(reader);
55 foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
56 {
57
58 if (nod.Attributes["name"] != null)
59 {
60 AnimsLLUUID.Add(nod.Attributes["name"].Value, nod.InnerText);
61 }
62
63 }
64
65 reader.Close();
66
67 // OpenSim.Framework.Console.MainLog.Instance.Verbose("Loaded " + AnimsLLUUID.Count.ToString() + " animation(s)");
68
69 foreach (KeyValuePair<string, LLUUID> kp in OpenSim.Region.Scenes.ScenePresence.Animations.AnimsLLUUID)
70 {
71 AnimsNames.Add(kp.Value, kp.Key);
72 }
73 }
74 }
75 }
76}
diff --git a/OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs b/OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs
new file mode 100644
index 0000000..d21b11f
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs
@@ -0,0 +1,90 @@
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.Physics.Manager;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36
37namespace OpenSim.Region.Scenes
38{
39 partial class ScenePresence
40 {
41 public class Avatar : IScenePresenceBody
42 {
43 public Avatar()
44 {
45
46 }
47
48 public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
49 {
50 }
51
52 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
53 {
54 }
55
56 public void SendOurAppearance(IClientAPI OurClient)
57 {
58 }
59
60 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
61 {
62 }
63 }
64
65 public class ChildAgent : IScenePresenceBody //is a ghost
66 {
67 public ChildAgent()
68 {
69
70 }
71
72 public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
73 {
74 }
75
76 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
77 {
78 }
79
80 public void SendOurAppearance(IClientAPI OurClient)
81 {
82 }
83
84 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
85 {
86 }
87 }
88 }
89
90}
diff --git a/OpenSim/Region/Simulation/Scenes/ScenePresence.cs b/OpenSim/Region/Simulation/Scenes/ScenePresence.cs
new file mode 100644
index 0000000..45d3fed
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/ScenePresence.cs
@@ -0,0 +1,525 @@
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.Text;
32using libsecondlife;
33using libsecondlife.Packets;
34using OpenSim.Physics.Manager;
35using OpenSim.Framework.Inventory;
36using OpenSim.Framework.Interfaces;
37using OpenSim.Framework.Types;
38using Axiom.MathLib;
39
40namespace OpenSim.Region.Scenes
41{
42 public partial class ScenePresence : Entity
43 {
44 public static bool PhysicsEngineFlying = false;
45 public static AvatarAnimations Animations;
46 public static byte[] DefaultTexture;
47 public string firstname;
48 public string lastname;
49 public IClientAPI ControllingClient;
50 public LLUUID current_anim;
51 public int anim_seq;
52 private bool updateflag = false;
53 private byte movementflag = 0;
54 private List<NewForce> forcesList = new List<NewForce>();
55 private short _updateCount = 0;
56 private Axiom.MathLib.Quaternion bodyRot;
57 private LLObject.TextureEntry avatarAppearanceTexture = null;
58 private byte[] visualParams;
59 private AvatarWearable[] Wearables;
60 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
61 private ulong m_regionHandle;
62 private bool childAgent = false;
63 private bool newForce = false;
64 private bool newAvatar = false;
65 private IScenePresenceBody m_body;
66
67 protected RegionInfo m_regionInfo;
68
69 #region Properties
70 /// <summary>
71 ///
72 /// </summary>
73 public PhysicsActor PhysActor
74 {
75 set
76 {
77 this._physActor = value;
78 }
79 get
80 {
81 return _physActor;
82 }
83 }
84 #endregion
85
86 #region Constructor(s)
87 /// <summary>
88 ///
89 /// </summary>
90 /// <param name="theClient"></param>
91 /// <param name="world"></param>
92 /// <param name="clientThreads"></param>
93 /// <param name="regionDat"></param>
94 public ScenePresence(IClientAPI theClient, Scene world, RegionInfo reginfo)
95 {
96
97 m_world = world;
98 this.uuid = theClient.AgentId;
99
100 m_regionInfo = reginfo;
101 m_regionHandle = reginfo.RegionHandle;
102 OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs ");
103 ControllingClient = theClient;
104 this.firstname = ControllingClient.FirstName;
105 this.lastname = ControllingClient.LastName;
106 m_localId = m_world.NextLocalId;
107 Pos = ControllingClient.StartPos;
108 visualParams = new byte[218];
109 for (int i = 0; i < 218; i++)
110 {
111 visualParams[i] = 100;
112 }
113
114 Wearables = AvatarWearable.DefaultWearables;
115
116 this.avatarAppearanceTexture = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
117
118 //register for events
119 ControllingClient.OnRequestWearables += this.SendOurAppearance;
120 //ControllingClient.OnSetAppearance += new SetAppearance(this.SetAppearance);
121 ControllingClient.OnCompleteMovementToRegion += this.CompleteMovement;
122 ControllingClient.OnCompleteMovementToRegion += this.SendInitialData;
123 ControllingClient.OnAgentUpdate += this.HandleAgentUpdate;
124 // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack);
125 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
126 //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
127
128 }
129 #endregion
130
131 #region Status Methods
132 /// <summary>
133 /// Not Used, most likely can be deleted
134 /// </summary>
135 /// <param name="status"></param>
136 public void ChildStatusChange(bool status)
137 {
138 this.childAgent = status;
139
140 if (this.childAgent == true)
141 {
142 this.Velocity = new LLVector3(0, 0, 0);
143 this.Pos = new LLVector3(128, 128, 70);
144
145 }
146 }
147
148 /// <summary>
149 ///
150 /// </summary>
151 /// <param name="pos"></param>
152 public void MakeAvatar(LLVector3 pos)
153 {
154 //this.childAvatar = false;
155 this.Pos = pos;
156 this.newAvatar = true;
157 this.childAgent = false;
158 }
159
160 protected void MakeChildAgent()
161 {
162 this.Velocity = new LLVector3(0, 0, 0);
163 this.Pos = new LLVector3(128, 128, 70);
164 this.childAgent = true;
165 }
166
167 /// <summary>
168 ///
169 /// </summary>
170 /// <param name="pos"></param>
171 public void Teleport(LLVector3 pos)
172 {
173 this.Pos = pos;
174 this.SendTerseUpdateToALLClients();
175 }
176
177 /// <summary>
178 ///
179 /// </summary>
180 public void StopMovement()
181 {
182
183 }
184 #endregion
185
186 #region Event Handlers
187 /// <summary>
188 ///
189 /// </summary>
190 /// <param name="texture"></param>
191 /// <param name="visualParam"></param>
192 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
193 {
194
195 }
196
197 /// <summary>
198 /// Complete Avatar's movement into the region
199 /// </summary>
200 public void CompleteMovement()
201 {
202 LLVector3 look = this.Velocity;
203 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
204 {
205 look = new LLVector3(0.99f, 0.042f, 0);
206 }
207 this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look);
208 if (this.childAgent)
209 {
210 this.childAgent = false;
211 }
212 }
213
214 /// <summary>
215 ///
216 /// </summary>
217 /// <param name="pack"></param>
218 public void HandleAgentUpdate(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
219 {
220 if ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS) != 0)
221 {
222 Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
223 if (((movementflag & 1) == 0) || (q != this.bodyRot))
224 {
225 Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0);
226 this.AddNewMovement(v3, q);
227 movementflag = 1;
228 this.bodyRot = q;
229 }
230 }
231 else if ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
232 {
233 Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
234 if (((movementflag & 2) == 0) || (q != this.bodyRot))
235 {
236 Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(-1, 0, 0);
237 this.AddNewMovement(v3, q);
238 movementflag = 2;
239 this.bodyRot = q;
240 }
241 }
242 else
243 {
244 if ((movementflag) != 0)
245 {
246 NewForce newVelocity = new NewForce();
247 newVelocity.X = 0;
248 newVelocity.Y = 0;
249 newVelocity.Z = 0;
250 this.forcesList.Add(newVelocity);
251 movementflag = 0;
252 }
253 }
254
255 }
256
257 protected void AddNewMovement(Axiom.MathLib.Vector3 vec, Axiom.MathLib.Quaternion rotation)
258 {
259 NewForce newVelocity = new NewForce();
260 Axiom.MathLib.Vector3 direc = rotation * vec;
261 direc.Normalize();
262
263 direc = direc * ((0.03f) * 128f);
264 if (this._physActor.Flying)
265 direc *= 4;
266
267 newVelocity.X = direc.x;
268 newVelocity.Y = direc.y;
269 newVelocity.Z = direc.z;
270 this.forcesList.Add(newVelocity);
271 }
272
273 #endregion
274
275 #region Overridden Methods
276 /// <summary>
277 ///
278 /// </summary>
279 public override void LandRenegerated()
280 {
281
282 }
283
284 /// <summary>
285 ///
286 /// </summary>
287 public override void update()
288 {
289 if (this.childAgent == false)
290 {
291 if (this.newForce)
292 {
293 this.SendTerseUpdateToALLClients();
294 _updateCount = 0;
295 }
296 else if (movementflag != 0)
297 {
298 _updateCount++;
299 if (_updateCount > 3)
300 {
301 this.SendTerseUpdateToALLClients();
302 _updateCount = 0;
303 }
304 }
305
306 this.CheckForBorderCrossing();
307 }
308 }
309 #endregion
310
311 #region Update Client(s)
312 /// <summary>
313 ///
314 /// </summary>
315 /// <param name="RemoteClient"></param>
316 public void SendTerseUpdateToClient(IClientAPI RemoteClient)
317 {
318 LLVector3 pos = this.Pos;
319 LLVector3 vel = this.Velocity;
320 RemoteClient.SendAvatarTerseUpdate(this.m_regionHandle, 64096, this.LocalId, new LLVector3(pos.X, pos.Y, pos.Z), new LLVector3(vel.X, vel.Y, vel.Z));
321 }
322
323 /// <summary>
324 ///
325 /// </summary>
326 public void SendTerseUpdateToALLClients()
327 {
328 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
329 for (int i = 0; i < avatars.Count; i++)
330 {
331 this.SendTerseUpdateToClient(avatars[i].ControllingClient);
332 }
333 }
334
335 /// <summary>
336 ///
337 /// </summary>
338 /// <param name="remoteAvatar"></param>
339 public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
340 {
341 remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
342 }
343
344 /// <summary>
345 ///
346 /// </summary>
347 public void SendInitialData()
348 {
349 this.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
350 if (this.newAvatar)
351 {
352 this.m_world.InformClientOfNeighbours(this.ControllingClient);
353 this.newAvatar = false;
354 }
355 }
356
357 /// <summary>
358 ///
359 /// </summary>
360 /// <param name="OurClient"></param>
361 public void SendOurAppearance(IClientAPI OurClient)
362 {
363 this.ControllingClient.SendWearables(this.Wearables);
364 }
365
366 /// <summary>
367 ///
368 /// </summary>
369 /// <param name="avatarInfo"></param>
370 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
371 {
372
373 }
374
375 /// <summary>
376 ///
377 /// </summary>
378 /// <param name="animID"></param>
379 /// <param name="seq"></param>
380 public void SendAnimPack(LLUUID animID, int seq)
381 {
382
383
384 }
385
386 /// <summary>
387 ///
388 /// </summary>
389 public void SendAnimPack()
390 {
391
392 }
393 #endregion
394
395 #region Border Crossing Methods
396 /// <summary>
397 ///
398 /// </summary>
399 protected void CheckForBorderCrossing()
400 {
401 LLVector3 pos2 = this.Pos;
402 LLVector3 vel = this.Velocity;
403
404 float timeStep = 0.2f;
405 pos2.X = pos2.X + (vel.X * timeStep);
406 pos2.Y = pos2.Y + (vel.Y * timeStep);
407 pos2.Z = pos2.Z + (vel.Z * timeStep);
408
409 if ((pos2.X < 0) || (pos2.X > 256))
410 {
411 this.CrossToNewRegion();
412 }
413
414 if ((pos2.Y < 0) || (pos2.Y > 256))
415 {
416 this.CrossToNewRegion();
417 }
418 }
419
420 /// <summary>
421 ///
422 /// </summary>
423 protected void CrossToNewRegion()
424 {
425 LLVector3 pos = this.Pos;
426 LLVector3 newpos = new LLVector3(pos.X, pos.Y, pos.Z);
427 uint neighbourx = this.m_regionInfo.RegionLocX;
428 uint neighboury = this.m_regionInfo.RegionLocY;
429
430 if (pos.X < 2)
431 {
432 neighbourx -= 1;
433 newpos.X = 254;
434 }
435 if (pos.X > 253)
436 {
437 neighbourx += 1;
438 newpos.X = 1;
439 }
440 if (pos.Y < 2)
441 {
442 neighboury -= 1;
443 newpos.Y = 254;
444 }
445 if (pos.Y > 253)
446 {
447 neighboury += 1;
448 newpos.Y = 1;
449 }
450
451 LLVector3 vel = this.velocity;
452 ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * 256), (uint)(neighboury * 256));
453 RegionInfo neighbourRegion = this.m_world.RequestNeighbouringRegionInfo(neighbourHandle);
454 if (neighbourRegion != null)
455 {
456 bool res = this.m_world.InformNeighbourOfCrossing(neighbourHandle, this.ControllingClient.AgentId, newpos);
457 if (res)
458 {
459 this.MakeChildAgent();
460 this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, System.Net.IPAddress.Parse(neighbourRegion.CommsIPListenAddr), (ushort)neighbourRegion.CommsIPListenPort);
461 }
462 }
463 }
464 #endregion
465
466 /// <summary>
467 ///
468 /// </summary>
469 public static void LoadAnims()
470 {
471
472 }
473
474 /// <summary>
475 ///
476 /// </summary>
477 public override void updateMovement()
478 {
479 newForce = false;
480 lock (this.forcesList)
481 {
482 if (this.forcesList.Count > 0)
483 {
484 for (int i = 0; i < this.forcesList.Count; i++)
485 {
486 NewForce force = this.forcesList[i];
487
488 this.updateflag = true;
489 this.Velocity = new LLVector3(force.X, force.Y, force.Z);
490 this.newForce = true;
491 }
492 for (int i = 0; i < this.forcesList.Count; i++)
493 {
494 this.forcesList.RemoveAt(0);
495 }
496 }
497 }
498 }
499
500 public static void LoadTextureFile(string name)
501 {
502 FileInfo fInfo = new FileInfo(name);
503 long numBytes = fInfo.Length;
504 FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read);
505 BinaryReader br = new BinaryReader(fStream);
506 byte[] data1 = br.ReadBytes((int)numBytes);
507 br.Close();
508 fStream.Close();
509 DefaultTexture = data1;
510 }
511
512 public class NewForce
513 {
514 public float X;
515 public float Y;
516 public float Z;
517
518 public NewForce()
519 {
520
521 }
522 }
523 }
524
525}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs b/OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs
new file mode 100644
index 0000000..daa1b92
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs
@@ -0,0 +1,40 @@
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;
32
33namespace OpenSim.Region.Scripting
34{
35 public interface IScriptContext
36 {
37 IScriptEntity Entity { get; }
38 bool TryGetRandomAvatar(out IScriptReadonlyEntity avatar);
39 }
40}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs b/OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs
new file mode 100644
index 0000000..44b886f
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs
@@ -0,0 +1,46 @@
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;
32
33namespace OpenSim.Region.Scripting
34{
35 public interface IScriptReadonlyEntity
36 {
37 LLVector3 Pos { get; }
38 string Name { get; }
39 }
40
41 public interface IScriptEntity
42 {
43 LLVector3 Pos { get; set; }
44 string Name { get; }
45 }
46}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs b/OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs
new file mode 100644
index 0000000..797998d
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs
@@ -0,0 +1,126 @@
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 OpenSim.Physics.Manager;
33using OpenSim.Region;
34using OpenSim.Region.Scenes;
35using Avatar=OpenSim.Region.Scenes.ScenePresence;
36using Primitive = OpenSim.Region.Scenes.Primitive;
37
38namespace OpenSim.Region.Scripting
39{
40 public delegate void ScriptEventHandler(IScriptContext context);
41
42 public class ScriptHandler : IScriptContext, IScriptEntity, IScriptReadonlyEntity
43 {
44 private Scene m_world;
45 private Script m_script;
46 private Entity m_entity;
47
48 public LLUUID ScriptId
49 {
50 get
51 {
52 return m_script.ScriptId;
53 }
54 }
55
56 public void OnFrame()
57 {
58 m_script.OnFrame(this);
59 }
60
61 public ScriptHandler(Script script, Entity entity, Scene world)
62 {
63 m_script = script;
64 m_entity = entity;
65 m_world = world;
66 }
67
68 #region IScriptContext Members
69
70 IScriptEntity IScriptContext.Entity
71 {
72 get
73 {
74 return this;
75 }
76 }
77
78 bool IScriptContext.TryGetRandomAvatar(out IScriptReadonlyEntity avatar)
79 {
80 foreach (Entity entity in m_world.Entities.Values )
81 {
82 if( entity is Avatar )
83 {
84 avatar = entity;
85 return true;
86 }
87 }
88
89 avatar = null;
90 return false;
91 }
92
93 #endregion
94
95 #region IScriptEntity and IScriptReadonlyEntity Members
96
97 public string Name
98 {
99 get
100 {
101 return m_entity.Name;
102 }
103 }
104
105 public LLVector3 Pos
106 {
107 get
108 {
109 return m_entity.Pos;
110 }
111
112 set
113 {
114 if (m_entity is Primitive)
115 {
116 Primitive prim = m_entity as Primitive;
117 // Of course, we really should have asked the physEngine if this is possible, and if not, returned false.
118 // prim.UpdatePosition( value );
119 }
120 }
121 }
122
123 #endregion
124 }
125
126}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/Script.cs b/OpenSim/Region/Simulation/Scenes/scripting/Script.cs
new file mode 100644
index 0000000..1d01f3c
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/Script.cs
@@ -0,0 +1,53 @@
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;
32
33namespace OpenSim.Region.Scripting
34{
35 public class Script
36 {
37 private LLUUID m_scriptId;
38 public virtual LLUUID ScriptId
39 {
40 get
41 {
42 return m_scriptId;
43 }
44 }
45
46 public Script( LLUUID scriptId )
47 {
48 m_scriptId = scriptId;
49 }
50
51 public ScriptEventHandler OnFrame;
52 }
53}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs b/OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs
new file mode 100644
index 0000000..32ef046
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs
@@ -0,0 +1,35 @@
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.Region.Scripting
33{
34 public delegate Script ScriptFactory();
35}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs b/OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs
new file mode 100644
index 0000000..21f07a8
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs
@@ -0,0 +1,64 @@
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;
32
33namespace OpenSim.Region.Scripting
34{
35 public class FollowRandomAvatar : Script
36 {
37 public FollowRandomAvatar()
38 : base(LLUUID.Random())
39 {
40 OnFrame += MyOnFrame;
41 }
42
43 private void MyOnFrame(IScriptContext context)
44 {
45 LLVector3 pos = context.Entity.Pos;
46
47 IScriptReadonlyEntity avatar;
48
49 if (context.TryGetRandomAvatar(out avatar))
50 {
51 LLVector3 avatarPos = avatar.Pos;
52
53 float x = pos.X + ((float)avatarPos.X.CompareTo(pos.X)) / 2;
54 float y = pos.Y + ((float)avatarPos.Y.CompareTo(pos.Y)) / 2;
55
56 LLVector3 newPos = new LLVector3(x, y, pos.Z);
57
58 context.Entity.Pos = newPos;
59 }
60 }
61 }
62
63
64}