diff options
Diffstat (limited to 'OpenSim/Region/CoreModules')
8 files changed, 907 insertions, 112 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index 6dacbba..acc3a78 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs | |||
@@ -49,7 +49,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
49 | private int m_shoutdistance = 100; | 49 | private int m_shoutdistance = 100; |
50 | private int m_whisperdistance = 10; | 50 | private int m_whisperdistance = 10; |
51 | private List<Scene> m_scenes = new List<Scene>(); | 51 | private List<Scene> m_scenes = new List<Scene>(); |
52 | 52 | private List<string> FreezeCache = new List<string>(); | |
53 | private string m_adminPrefix = ""; | ||
53 | internal object m_syncy = new object(); | 54 | internal object m_syncy = new object(); |
54 | 55 | ||
55 | internal IConfig m_config; | 56 | internal IConfig m_config; |
@@ -76,6 +77,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
76 | m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance); | 77 | m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance); |
77 | m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance); | 78 | m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance); |
78 | m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance); | 79 | m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance); |
80 | m_adminPrefix = config.Configs["Chat"].GetString("admin_prefix", ""); | ||
79 | } | 81 | } |
80 | 82 | ||
81 | public virtual void AddRegion(Scene scene) | 83 | public virtual void AddRegion(Scene scene) |
@@ -171,7 +173,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
171 | return; | 173 | return; |
172 | } | 174 | } |
173 | 175 | ||
174 | DeliverChatToAvatars(ChatSourceType.Agent, c); | 176 | if (FreezeCache.Contains(c.Sender.AgentId.ToString())) |
177 | { | ||
178 | if (c.Type != ChatTypeEnum.StartTyping || c.Type != ChatTypeEnum.StopTyping) | ||
179 | c.Sender.SendAgentAlertMessage("You may not talk as you are frozen.", false); | ||
180 | } | ||
181 | else | ||
182 | { | ||
183 | DeliverChatToAvatars(ChatSourceType.Agent, c); | ||
184 | } | ||
175 | } | 185 | } |
176 | 186 | ||
177 | public virtual void OnChatFromWorld(Object sender, OSChatMessage c) | 187 | public virtual void OnChatFromWorld(Object sender, OSChatMessage c) |
@@ -185,6 +195,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
185 | protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMessage c) | 195 | protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMessage c) |
186 | { | 196 | { |
187 | string fromName = c.From; | 197 | string fromName = c.From; |
198 | string fromNamePrefix = ""; | ||
188 | UUID fromID = UUID.Zero; | 199 | UUID fromID = UUID.Zero; |
189 | string message = c.Message; | 200 | string message = c.Message; |
190 | IScene scene = c.Scene; | 201 | IScene scene = c.Scene; |
@@ -207,7 +218,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
207 | fromPos = avatar.AbsolutePosition; | 218 | fromPos = avatar.AbsolutePosition; |
208 | fromName = avatar.Name; | 219 | fromName = avatar.Name; |
209 | fromID = c.Sender.AgentId; | 220 | fromID = c.Sender.AgentId; |
210 | 221 | if (avatar.GodLevel > 200) | |
222 | { | ||
223 | fromNamePrefix = m_adminPrefix; | ||
224 | } | ||
211 | break; | 225 | break; |
212 | 226 | ||
213 | case ChatSourceType.Object: | 227 | case ChatSourceType.Object: |
@@ -227,7 +241,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
227 | s.ForEachScenePresence( | 241 | s.ForEachScenePresence( |
228 | delegate(ScenePresence presence) | 242 | delegate(ScenePresence presence) |
229 | { | 243 | { |
230 | TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType); | 244 | ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); |
245 | if (Presencecheck != null) | ||
246 | { | ||
247 | if (Presencecheck.IsEitherBannedOrRestricted(c.SenderUUID) != true) | ||
248 | { | ||
249 | TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix+fromName, c.Type, message, sourceType); | ||
250 | } | ||
251 | } | ||
252 | |||
231 | } | 253 | } |
232 | ); | 254 | ); |
233 | } | 255 | } |
@@ -266,25 +288,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
266 | } | 288 | } |
267 | 289 | ||
268 | // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); | 290 | // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); |
269 | 291 | if (c.Scene != null) | |
270 | ((Scene)c.Scene).ForEachScenePresence( | 292 | { |
271 | delegate(ScenePresence presence) | 293 | ((Scene)c.Scene).ForEachScenePresence |
272 | { | 294 | ( |
273 | // ignore chat from child agents | 295 | delegate(ScenePresence presence) |
274 | if (presence.IsChildAgent) return; | 296 | { |
275 | 297 | // ignore chat from child agents | |
276 | IClientAPI client = presence.ControllingClient; | 298 | if (presence.IsChildAgent) return; |
277 | 299 | ||
278 | // don't forward SayOwner chat from objects to | 300 | IClientAPI client = presence.ControllingClient; |
279 | // non-owner agents | 301 | |
280 | if ((c.Type == ChatTypeEnum.Owner) && | 302 | // don't forward SayOwner chat from objects to |
281 | (null != c.SenderObject) && | 303 | // non-owner agents |
282 | (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId)) | 304 | if ((c.Type == ChatTypeEnum.Owner) && |
283 | return; | 305 | (null != c.SenderObject) && |
284 | 306 | (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId)) | |
285 | client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, | 307 | return; |
286 | (byte)sourceType, (byte)ChatAudibleLevel.Fully); | 308 | |
287 | }); | 309 | client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, |
310 | (byte)sourceType, (byte)ChatAudibleLevel.Fully); | ||
311 | } | ||
312 | ); | ||
313 | } | ||
288 | } | 314 | } |
289 | 315 | ||
290 | 316 | ||
@@ -313,5 +339,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
313 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, | 339 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, |
314 | fromAgentID,(byte)src,(byte)ChatAudibleLevel.Fully); | 340 | fromAgentID,(byte)src,(byte)ChatAudibleLevel.Fully); |
315 | } | 341 | } |
342 | |||
343 | Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>(); | ||
344 | public void ParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target) | ||
345 | { | ||
346 | System.Threading.Timer Timer; | ||
347 | if (flags == 0) | ||
348 | { | ||
349 | FreezeCache.Add(target.ToString()); | ||
350 | System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen); | ||
351 | Timer = new System.Threading.Timer(timeCB, target, 30000, 0); | ||
352 | Timers.Add(target, Timer); | ||
353 | } | ||
354 | else | ||
355 | { | ||
356 | FreezeCache.Remove(target.ToString()); | ||
357 | Timers.TryGetValue(target, out Timer); | ||
358 | Timers.Remove(target); | ||
359 | Timer.Dispose(); | ||
360 | } | ||
361 | } | ||
362 | |||
363 | private void OnEndParcelFrozen(object avatar) | ||
364 | { | ||
365 | UUID target = (UUID)avatar; | ||
366 | FreezeCache.Remove(target.ToString()); | ||
367 | System.Threading.Timer Timer; | ||
368 | Timers.TryGetValue(target, out Timer); | ||
369 | Timers.Remove(target); | ||
370 | Timer.Dispose(); | ||
371 | } | ||
316 | } | 372 | } |
317 | } | 373 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs index 450897c..257c221 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs | |||
@@ -168,19 +168,22 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
168 | List<GridInstantMessage>msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>( | 168 | List<GridInstantMessage>msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>( |
169 | "POST", m_RestURL+"/RetrieveMessages/", client.AgentId); | 169 | "POST", m_RestURL+"/RetrieveMessages/", client.AgentId); |
170 | 170 | ||
171 | foreach (GridInstantMessage im in msglist) | 171 | if (msglist != null) |
172 | { | 172 | { |
173 | // client.SendInstantMessage(im); | 173 | foreach (GridInstantMessage im in msglist) |
174 | 174 | { | |
175 | // Send through scene event manager so all modules get a chance | 175 | // client.SendInstantMessage(im); |
176 | // to look at this message before it gets delivered. | 176 | |
177 | // | 177 | // Send through scene event manager so all modules get a chance |
178 | // Needed for proper state management for stored group | 178 | // to look at this message before it gets delivered. |
179 | // invitations | 179 | // |
180 | // | 180 | // Needed for proper state management for stored group |
181 | Scene s = FindScene(client.AgentId); | 181 | // invitations |
182 | if (s != null) | 182 | // |
183 | s.EventManager.TriggerIncomingInstantMessage(im); | 183 | Scene s = FindScene(client.AgentId); |
184 | if (s != null) | ||
185 | s.EventManager.TriggerIncomingInstantMessage(im); | ||
186 | } | ||
184 | } | 187 | } |
185 | } | 188 | } |
186 | 189 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index d9a021f..b60b32b 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -389,7 +389,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
389 | { | 389 | { |
390 | // Check if this is ours to handle | 390 | // Check if this is ours to handle |
391 | // | 391 | // |
392 | m_log.Info("OnFridInstantMessage"); | 392 | //m_log.Info("OnFridInstantMessage"); |
393 | if (msg.dialog != (byte) InstantMessageDialog.InventoryOffered) | 393 | if (msg.dialog != (byte) InstantMessageDialog.InventoryOffered) |
394 | return; | 394 | return; |
395 | 395 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs index 44458d1..0357c60 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs | |||
@@ -331,12 +331,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
331 | { | 331 | { |
332 | //m_log.Debug("[CONNECTION DEBUGGING]: AgentHandler Called"); | 332 | //m_log.Debug("[CONNECTION DEBUGGING]: AgentHandler Called"); |
333 | 333 | ||
334 | m_log.Debug("---------------------------"); | 334 | /* m_log.Debug("---------------------------"); |
335 | m_log.Debug(" >> uri=" + request["uri"]); | 335 | m_log.Debug(" >> uri=" + request["uri"]); |
336 | m_log.Debug(" >> content-type=" + request["content-type"]); | 336 | m_log.Debug(" >> content-type=" + request["content-type"]); |
337 | m_log.Debug(" >> http-method=" + request["http-method"]); | 337 | m_log.Debug(" >> http-method=" + request["http-method"]); |
338 | m_log.Debug("---------------------------\n"); | 338 | m_log.Debug("---------------------------\n"); */ |
339 | |||
340 | Hashtable responsedata = new Hashtable(); | 339 | Hashtable responsedata = new Hashtable(); |
341 | responsedata["content_type"] = "text/html"; | 340 | responsedata["content_type"] = "text/html"; |
342 | responsedata["keepalive"] = false; | 341 | responsedata["keepalive"] = false; |
@@ -581,11 +580,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
581 | { | 580 | { |
582 | m_log.Debug("[CONNECTION DEBUGGING]: ObjectHandler Called"); | 581 | m_log.Debug("[CONNECTION DEBUGGING]: ObjectHandler Called"); |
583 | 582 | ||
584 | m_log.Debug("---------------------------"); | 583 | /* m_log.Debug("---------------------------"); |
585 | m_log.Debug(" >> uri=" + request["uri"]); | 584 | m_log.Debug(" >> uri=" + request["uri"]); |
586 | m_log.Debug(" >> content-type=" + request["content-type"]); | 585 | m_log.Debug(" >> content-type=" + request["content-type"]); |
587 | m_log.Debug(" >> http-method=" + request["http-method"]); | 586 | m_log.Debug(" >> http-method=" + request["http-method"]); |
588 | m_log.Debug("---------------------------\n"); | 587 | m_log.Debug("---------------------------\n"); */ |
589 | 588 | ||
590 | Hashtable responsedata = new Hashtable(); | 589 | Hashtable responsedata = new Hashtable(); |
591 | responsedata["content_type"] = "text/html"; | 590 | responsedata["content_type"] = "text/html"; |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 52add23..68d13b7 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | |||
@@ -247,21 +247,20 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
247 | // Fix ownership/creator of inventory items | 247 | // Fix ownership/creator of inventory items |
248 | // Not doing so results in inventory items | 248 | // Not doing so results in inventory items |
249 | // being no copy/no mod for everyone | 249 | // being no copy/no mod for everyone |
250 | lock (part.TaskInventory) | 250 | part.TaskInventory.LockItemsForRead(true); |
251 | TaskInventoryDictionary inv = part.TaskInventory; | ||
252 | foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv) | ||
251 | { | 253 | { |
252 | TaskInventoryDictionary inv = part.TaskInventory; | 254 | if (!ResolveUserUuid(kvp.Value.OwnerID)) |
253 | foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv) | ||
254 | { | 255 | { |
255 | if (!ResolveUserUuid(kvp.Value.OwnerID)) | 256 | kvp.Value.OwnerID = masterAvatarId; |
256 | { | 257 | } |
257 | kvp.Value.OwnerID = masterAvatarId; | 258 | if (!ResolveUserUuid(kvp.Value.CreatorID)) |
258 | } | 259 | { |
259 | if (!ResolveUserUuid(kvp.Value.CreatorID)) | 260 | kvp.Value.CreatorID = masterAvatarId; |
260 | { | ||
261 | kvp.Value.CreatorID = masterAvatarId; | ||
262 | } | ||
263 | } | 261 | } |
264 | } | 262 | } |
263 | part.TaskInventory.LockItemsForRead(false); | ||
265 | } | 264 | } |
266 | 265 | ||
267 | if (m_scene.AddRestoredSceneObject(sceneObject, true, false)) | 266 | if (m_scene.AddRestoredSceneObject(sceneObject, true, false)) |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 9b39b09..28669b9 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -81,6 +81,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
81 | private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; | 81 | private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; |
82 | 82 | ||
83 | private bool m_allowedForcefulBans = true; | 83 | private bool m_allowedForcefulBans = true; |
84 | private UUID DefaultGodParcelGroup; | ||
85 | private string DefaultGodParcelName; | ||
84 | 86 | ||
85 | // caches ExtendedLandData | 87 | // caches ExtendedLandData |
86 | private Cache parcelInfoCache; | 88 | private Cache parcelInfoCache; |
@@ -94,6 +96,12 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
94 | 96 | ||
95 | public void Initialise(IConfigSource source) | 97 | public void Initialise(IConfigSource source) |
96 | { | 98 | { |
99 | IConfig cnf = source.Configs["LandManagement"]; | ||
100 | if (cnf == null) | ||
101 | { | ||
102 | DefaultGodParcelGroup = new UUID(cnf.GetString("DefaultAdministratorGroupUUID", UUID.Zero.ToString())); | ||
103 | DefaultGodParcelName = cnf.GetString("DefaultAdministratorParcelName", "Default Parcel"); | ||
104 | } | ||
97 | } | 105 | } |
98 | 106 | ||
99 | public void AddRegion(Scene scene) | 107 | public void AddRegion(Scene scene) |
@@ -153,6 +161,10 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
153 | client.OnParcelInfoRequest += ClientOnParcelInfoRequest; | 161 | client.OnParcelInfoRequest += ClientOnParcelInfoRequest; |
154 | client.OnParcelDwellRequest += ClientOnParcelDwellRequest; | 162 | client.OnParcelDwellRequest += ClientOnParcelDwellRequest; |
155 | client.OnParcelDeedToGroup += ClientOnParcelDeedToGroup; | 163 | client.OnParcelDeedToGroup += ClientOnParcelDeedToGroup; |
164 | client.OnParcelGodMark += ClientOnParcelGodMark; | ||
165 | client.OnSimWideDeletes += ClientOnSimWideDeletes; | ||
166 | client.OnParcelFreezeUser += ClientOnParcelFreezeUser; | ||
167 | client.OnParcelEjectUser += ClientOnParcelEjectUser; | ||
156 | 168 | ||
157 | EntityBase presenceEntity; | 169 | EntityBase presenceEntity; |
158 | if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence) | 170 | if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence) |
@@ -264,20 +276,103 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
264 | return parcelsNear; | 276 | return parcelsNear; |
265 | } | 277 | } |
266 | 278 | ||
267 | public void SendYouAreBannedNotice(ScenePresence avatar) | 279 | |
280 | public void MoveUserOutOfParcel(ScenePresence avatar) | ||
268 | { | 281 | { |
269 | if (AllowedForcefulBans) | 282 | if (avatar.GodLevel == 0) |
270 | { | 283 | { |
271 | avatar.ControllingClient.SendAlertMessage( | 284 | ILandObject land = m_scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); |
272 | "You are not allowed on this parcel because you are banned. Please go away."); | 285 | List<ILandObject> parcelsNear = new List<ILandObject>(); |
273 | 286 | ||
274 | avatar.PhysicsActor.Position = avatar.lastKnownAllowedPosition; | 287 | for (int x = -2; x <= 2; x += 2) |
275 | avatar.PhysicsActor.Velocity = Vector3.Zero; | 288 | { |
276 | } | 289 | ILandObject check = GetLandObject(avatar.AbsolutePosition.X + x, avatar.AbsolutePosition.Y); |
277 | else | 290 | if (check != null) |
278 | { | 291 | { |
279 | avatar.ControllingClient.SendAlertMessage( | 292 | if (check.IsEitherBannedOrRestricted(avatar.UUID) != true) |
280 | "You are not allowed on this parcel because you are banned; however, the grid administrator has disabled ban lines globally. Please obey the land owner's requests or you can be banned from the entire sim!"); | 293 | { |
294 | Vector3 target = new Vector3(avatar.AbsolutePosition.X + x, avatar.AbsolutePosition.Y, avatar.AbsolutePosition.Z); | ||
295 | avatar.TeleportWithMomentum(target); | ||
296 | return; | ||
297 | } | ||
298 | } | ||
299 | } | ||
300 | for (int y = -2; y <= 2; y += 2) | ||
301 | { | ||
302 | ILandObject check = GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y + y); | ||
303 | if (check != null) | ||
304 | { | ||
305 | if (check.IsEitherBannedOrRestricted(avatar.UUID) != true) | ||
306 | { | ||
307 | Vector3 target = new Vector3(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y + y, avatar.AbsolutePosition.Z); | ||
308 | avatar.TeleportWithMomentum(target); | ||
309 | return; | ||
310 | } | ||
311 | } | ||
312 | } | ||
313 | List<ILandObject> allParcels = new List<ILandObject>(); | ||
314 | allParcels = AllParcels(); | ||
315 | if (allParcels.Count != 1) | ||
316 | { | ||
317 | foreach (ILandObject parcel in allParcels) | ||
318 | { | ||
319 | if (parcel.IsEitherBannedOrRestricted(avatar.UUID) != true) | ||
320 | { | ||
321 | Vector3 temptarget = parcel.LandData.UserLocation; | ||
322 | if (parcel.ContainsPoint((int)parcel.LandData.UserLocation.X, (int)parcel.LandData.UserLocation.Y)) | ||
323 | { | ||
324 | avatar.TeleportWithMomentum(temptarget); | ||
325 | return; | ||
326 | } | ||
327 | else | ||
328 | { | ||
329 | for (int x = 0; x <= Constants.RegionSize / 3; x += 3) | ||
330 | { | ||
331 | for (int y = 0; y <= Constants.RegionSize / 3; y += 3) | ||
332 | { | ||
333 | if (parcel.ContainsPoint(x, y)) | ||
334 | { | ||
335 | temptarget = new Vector3(x, y, avatar.AbsolutePosition.Z); | ||
336 | avatar.TeleportWithMomentum(temptarget); | ||
337 | return; | ||
338 | } | ||
339 | } | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | } | ||
344 | } | ||
345 | //Move to region side | ||
346 | if (avatar.AbsolutePosition.X > avatar.AbsolutePosition.Y) | ||
347 | { | ||
348 | if (avatar.AbsolutePosition.X > .5 * Constants.RegionSize) | ||
349 | { | ||
350 | Vector3 target = new Vector3(Constants.RegionSize, avatar.AbsolutePosition.Y, avatar.AbsolutePosition.Z); ; | ||
351 | avatar.TeleportWithMomentum(target); | ||
352 | return; | ||
353 | } | ||
354 | else | ||
355 | { | ||
356 | Vector3 target = new Vector3(0, avatar.AbsolutePosition.Y, avatar.AbsolutePosition.Z); ; | ||
357 | avatar.TeleportWithMomentum(target); | ||
358 | return; | ||
359 | } | ||
360 | } | ||
361 | else | ||
362 | { | ||
363 | if (avatar.AbsolutePosition.Y > .5 * Constants.RegionSize) | ||
364 | { | ||
365 | Vector3 target = new Vector3(avatar.AbsolutePosition.X, Constants.RegionSize, avatar.AbsolutePosition.Z); ; | ||
366 | avatar.TeleportWithMomentum(target); | ||
367 | return; | ||
368 | } | ||
369 | else | ||
370 | { | ||
371 | Vector3 target = new Vector3(avatar.AbsolutePosition.X, 0, avatar.AbsolutePosition.Z); ; | ||
372 | avatar.TeleportWithMomentum(target); | ||
373 | return; | ||
374 | } | ||
375 | } | ||
281 | } | 376 | } |
282 | } | 377 | } |
283 | 378 | ||
@@ -297,16 +392,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
297 | { | 392 | { |
298 | if (parcelAvatarIsEntering.IsBannedFromLand(avatar.UUID)) | 393 | if (parcelAvatarIsEntering.IsBannedFromLand(avatar.UUID)) |
299 | { | 394 | { |
300 | SendYouAreBannedNotice(avatar); | 395 | MoveUserOutOfParcel(avatar); |
301 | } | ||
302 | else if (parcelAvatarIsEntering.IsRestrictedFromLand(avatar.UUID)) | ||
303 | { | ||
304 | avatar.ControllingClient.SendAlertMessage( | ||
305 | "You are not allowed on this parcel because the land owner has restricted access. For now, you can enter, but please respect the land owner's decisions (or he can ban you!)."); | ||
306 | } | ||
307 | else | ||
308 | { | ||
309 | avatar.sentMessageAboutRestrictedParcelFlyingDown = true; | ||
310 | } | 396 | } |
311 | } | 397 | } |
312 | else | 398 | else |
@@ -317,28 +403,47 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
317 | } | 403 | } |
318 | } | 404 | } |
319 | 405 | ||
320 | public void SendOutNearestBanLine(IClientAPI avatar) | 406 | public void SendOutNearestBanLine(ScenePresence avatar) |
321 | { | 407 | { |
322 | List<ScenePresence> avatars = m_scene.GetAvatars(); | 408 | ILandObject checkBan = null; |
323 | foreach (ScenePresence presence in avatars) | 409 | for (int x = -2; x <= 2; x += 2) |
324 | { | 410 | { |
325 | if (presence.UUID == avatar.AgentId) | 411 | checkBan = GetLandObject(avatar.AbsolutePosition.X + x, avatar.AbsolutePosition.Y); |
412 | if (checkBan != null) | ||
326 | { | 413 | { |
327 | List<ILandObject> checkLandParcels = ParcelsNearPoint(presence.AbsolutePosition); | 414 | if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT) |
328 | foreach (ILandObject checkBan in checkLandParcels) | ||
329 | { | 415 | { |
330 | if (checkBan.IsBannedFromLand(avatar.AgentId)) | 416 | if (checkBan.IsRestrictedFromLand(avatar.ControllingClient.AgentId)) |
331 | { | 417 | { |
332 | checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionBanned, false, (int)ParcelResult.Single, avatar); | 418 | checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionNotOnAccessList, true, (int)ParcelResult.Multiple, avatar.ControllingClient); |
333 | return; //Only send one | 419 | return; |
334 | } | 420 | } |
335 | if (checkBan.IsRestrictedFromLand(avatar.AgentId)) | 421 | if (checkBan.IsBannedFromLand(avatar.ControllingClient.AgentId)) |
336 | { | 422 | { |
337 | checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionNotOnAccessList, false, (int)ParcelResult.Single, avatar); | 423 | checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionBanned, true, (int)ParcelResult.Multiple, avatar.ControllingClient); |
338 | return; //Only send one | 424 | return; |
425 | } | ||
426 | } | ||
427 | } | ||
428 | } | ||
429 | for (int y = -2; y <= 2; y += 2) | ||
430 | { | ||
431 | checkBan = GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y + y); | ||
432 | if (checkBan != null) | ||
433 | { | ||
434 | if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT) | ||
435 | { | ||
436 | if (checkBan.IsRestrictedFromLand(avatar.ControllingClient.AgentId)) | ||
437 | { | ||
438 | checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionNotOnAccessList, true, (int)ParcelResult.Multiple, avatar.ControllingClient); | ||
439 | return; | ||
440 | } | ||
441 | if (checkBan.IsBannedFromLand(avatar.ControllingClient.AgentId)) | ||
442 | { | ||
443 | checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionBanned, true, (int)ParcelResult.Multiple, avatar.ControllingClient); | ||
444 | return; | ||
339 | } | 445 | } |
340 | } | 446 | } |
341 | return; | ||
342 | } | 447 | } |
343 | } | 448 | } |
344 | } | 449 | } |
@@ -385,25 +490,14 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
385 | if (clientAvatar != null) | 490 | if (clientAvatar != null) |
386 | { | 491 | { |
387 | SendLandUpdate(clientAvatar); | 492 | SendLandUpdate(clientAvatar); |
388 | SendOutNearestBanLine(remote_client); | 493 | SendOutNearestBanLine(clientAvatar); |
389 | ILandObject parcel = GetLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y); | 494 | ILandObject parcel = GetLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y); |
390 | if (parcel != null) | 495 | if (parcel != null) |
391 | { | 496 | { |
392 | if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT && | 497 | if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT && |
393 | clientAvatar.sentMessageAboutRestrictedParcelFlyingDown) | ||
394 | { | ||
395 | EventManagerOnAvatarEnteringNewParcel(clientAvatar, parcel.LandData.LocalID, | ||
396 | m_scene.RegionInfo.RegionID); | ||
397 | //They are going under the safety line! | ||
398 | if (!parcel.IsBannedFromLand(clientAvatar.UUID)) | ||
399 | { | ||
400 | clientAvatar.sentMessageAboutRestrictedParcelFlyingDown = false; | ||
401 | } | ||
402 | } | ||
403 | else if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT && | ||
404 | parcel.IsBannedFromLand(clientAvatar.UUID)) | 498 | parcel.IsBannedFromLand(clientAvatar.UUID)) |
405 | { | 499 | { |
406 | SendYouAreBannedNotice(clientAvatar); | 500 | MoveUserOutOfParcel(clientAvatar); |
407 | } | 501 | } |
408 | } | 502 | } |
409 | } | 503 | } |
@@ -451,9 +545,21 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
451 | 545 | ||
452 | if (land != null) | 546 | if (land != null) |
453 | { | 547 | { |
454 | if (agentID == land.LandData.OwnerID) | 548 | if (m_scene.Permissions.CanEditParcel(agentID, land)) |
455 | { | 549 | { |
456 | land.UpdateAccessList(flags, entries, remote_client); | 550 | land.UpdateAccessList(flags, entries, remote_client); |
551 | List<ScenePresence> presences = ((Scene)remote_client.Scene).GetAvatars(); | ||
552 | foreach (ScenePresence presence in presences) | ||
553 | { | ||
554 | land = GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); | ||
555 | if (land != null) | ||
556 | { | ||
557 | if (land.IsEitherBannedOrRestricted(presence.UUID)) | ||
558 | { | ||
559 | MoveUserOutOfParcel(presence); | ||
560 | } | ||
561 | } | ||
562 | } | ||
457 | } | 563 | } |
458 | } | 564 | } |
459 | else | 565 | else |
@@ -1019,7 +1125,25 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1019 | m_landList.TryGetValue(localID, out land); | 1125 | m_landList.TryGetValue(localID, out land); |
1020 | } | 1126 | } |
1021 | 1127 | ||
1022 | if (land != null) land.UpdateLandProperties(args, remote_client); | 1128 | if (land != null) |
1129 | { | ||
1130 | land.UpdateLandProperties(args, remote_client); | ||
1131 | if ((args.ParcelFlags & (uint)(ParcelFlags.UseBanList | ParcelFlags.UseAccessList | ParcelFlags.UseAccessGroup | ParcelFlags.UsePassList)) != 0) | ||
1132 | { | ||
1133 | List<ScenePresence> presences = ((Scene)remote_client.Scene).GetAvatars(); | ||
1134 | foreach (ScenePresence presence in presences) | ||
1135 | { | ||
1136 | land = GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); | ||
1137 | if (land != null) | ||
1138 | { | ||
1139 | if (land.IsEitherBannedOrRestricted(presence.UUID)) | ||
1140 | { | ||
1141 | MoveUserOutOfParcel(presence); | ||
1142 | } | ||
1143 | } | ||
1144 | } | ||
1145 | } | ||
1146 | } | ||
1023 | } | 1147 | } |
1024 | 1148 | ||
1025 | public void ClientOnParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client) | 1149 | public void ClientOnParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client) |
@@ -1437,5 +1561,319 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1437 | 1561 | ||
1438 | UpdateLandObject(localID, land.LandData); | 1562 | UpdateLandObject(localID, land.LandData); |
1439 | } | 1563 | } |
1564 | public void ClientOnParcelGodMark(IClientAPI client, UUID god, int landID) | ||
1565 | { | ||
1566 | ILandObject land = null; | ||
1567 | List<ILandObject> Land = ((Scene)client.Scene).LandChannel.AllParcels(); | ||
1568 | foreach (ILandObject landObject in Land) | ||
1569 | { | ||
1570 | if (landObject.LandData.LocalID == landID) | ||
1571 | { | ||
1572 | land = landObject; | ||
1573 | } | ||
1574 | } | ||
1575 | land.DeedToGroup(DefaultGodParcelGroup); | ||
1576 | land.LandData.Name = DefaultGodParcelName; | ||
1577 | land.SendLandUpdateToAvatarsOverMe(); | ||
1578 | } | ||
1579 | private void ClientOnSimWideDeletes(IClientAPI client, UUID agentID, int flags, UUID targetID) | ||
1580 | { | ||
1581 | ScenePresence SP; | ||
1582 | ((Scene)client.Scene).TryGetAvatar(client.AgentId, out SP); | ||
1583 | List<SceneObjectGroup> returns = new List<SceneObjectGroup>(); | ||
1584 | if (SP.GodLevel != 0) | ||
1585 | { | ||
1586 | if (flags == 0) //All parcels, scripted or not | ||
1587 | { | ||
1588 | ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e) | ||
1589 | { | ||
1590 | if (e.OwnerID == targetID) | ||
1591 | { | ||
1592 | returns.Add(e); | ||
1593 | } | ||
1594 | } | ||
1595 | ); | ||
1596 | } | ||
1597 | if (flags == 4) //All parcels, scripted object | ||
1598 | { | ||
1599 | ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e) | ||
1600 | { | ||
1601 | if (e.OwnerID == targetID) | ||
1602 | { | ||
1603 | if (e.scriptScore >= 0.01) | ||
1604 | { | ||
1605 | returns.Add(e); | ||
1606 | } | ||
1607 | } | ||
1608 | } | ||
1609 | ); | ||
1610 | } | ||
1611 | if (flags == 4) //not target parcel, scripted object | ||
1612 | { | ||
1613 | ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e) | ||
1614 | { | ||
1615 | if (e.OwnerID == targetID) | ||
1616 | { | ||
1617 | ILandObject landobject = ((Scene)client.Scene).LandChannel.GetLandObject(e.AbsolutePosition.X, e.AbsolutePosition.Y); | ||
1618 | if (landobject.LandData.OwnerID != e.OwnerID) | ||
1619 | { | ||
1620 | if (e.scriptScore >= 0.01) | ||
1621 | { | ||
1622 | returns.Add(e); | ||
1623 | } | ||
1624 | } | ||
1625 | } | ||
1626 | } | ||
1627 | ); | ||
1628 | } | ||
1629 | foreach (SceneObjectGroup ol in returns) | ||
1630 | { | ||
1631 | ReturnObject(ol, client); | ||
1632 | } | ||
1633 | } | ||
1634 | } | ||
1635 | public void ReturnObject(SceneObjectGroup obj, IClientAPI client) | ||
1636 | { | ||
1637 | SceneObjectGroup[] objs = new SceneObjectGroup[1]; | ||
1638 | objs[0] = obj; | ||
1639 | ((Scene)client.Scene).returnObjects(objs, client.AgentId); | ||
1640 | } | ||
1641 | |||
1642 | Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>(); | ||
1643 | |||
1644 | public void ClientOnParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target) | ||
1645 | { | ||
1646 | ScenePresence targetAvatar = null; | ||
1647 | ((Scene)client.Scene).TryGetAvatar(target, out targetAvatar); | ||
1648 | ScenePresence parcelManager = null; | ||
1649 | ((Scene)client.Scene).TryGetAvatar(client.AgentId, out parcelManager); | ||
1650 | System.Threading.Timer Timer; | ||
1651 | |||
1652 | if (targetAvatar.GodLevel == 0) | ||
1653 | { | ||
1654 | ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); | ||
1655 | if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land)) | ||
1656 | return; | ||
1657 | if (flags == 0) | ||
1658 | { | ||
1659 | targetAvatar.AllowMovement = false; | ||
1660 | targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has frozen you for 30 seconds. You cannot move or interact with the world."); | ||
1661 | parcelManager.ControllingClient.SendAlertMessage("Avatar Frozen."); | ||
1662 | System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen); | ||
1663 | Timer = new System.Threading.Timer(timeCB, targetAvatar, 30000, 0); | ||
1664 | Timers.Add(targetAvatar.UUID, Timer); | ||
1665 | } | ||
1666 | else | ||
1667 | { | ||
1668 | targetAvatar.AllowMovement = true; | ||
1669 | targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has unfrozen you."); | ||
1670 | parcelManager.ControllingClient.SendAlertMessage("Avatar Unfrozen."); | ||
1671 | Timers.TryGetValue(targetAvatar.UUID, out Timer); | ||
1672 | Timers.Remove(targetAvatar.UUID); | ||
1673 | Timer.Dispose(); | ||
1674 | } | ||
1675 | } | ||
1676 | } | ||
1677 | private void OnEndParcelFrozen(object avatar) | ||
1678 | { | ||
1679 | ScenePresence targetAvatar = (ScenePresence)avatar; | ||
1680 | targetAvatar.AllowMovement = true; | ||
1681 | System.Threading.Timer Timer; | ||
1682 | Timers.TryGetValue(targetAvatar.UUID, out Timer); | ||
1683 | Timers.Remove(targetAvatar.UUID); | ||
1684 | targetAvatar.ControllingClient.SendAgentAlertMessage("The freeze has worn off; you may go about your business.", false); | ||
1685 | } | ||
1686 | |||
1687 | |||
1688 | public void ClientOnParcelEjectUser(IClientAPI client, UUID parcelowner, uint flags, UUID target) | ||
1689 | { | ||
1690 | ScenePresence targetAvatar = null; | ||
1691 | ((Scene)client.Scene).TryGetAvatar(target, out targetAvatar); | ||
1692 | ScenePresence parcelManager = null; | ||
1693 | ((Scene)client.Scene).TryGetAvatar(client.AgentId, out parcelManager); | ||
1694 | //Just eject | ||
1695 | if (flags == 0) | ||
1696 | { | ||
1697 | if (targetAvatar.GodLevel == 0) | ||
1698 | { | ||
1699 | ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); | ||
1700 | if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land)) | ||
1701 | return; | ||
1702 | |||
1703 | Vector3 position = new Vector3(0, 0, 0); | ||
1704 | List<ILandObject> allParcels = new List<ILandObject>(); | ||
1705 | allParcels = AllParcels(); | ||
1706 | if (allParcels.Count != 1) | ||
1707 | { | ||
1708 | foreach (ILandObject parcel in allParcels) | ||
1709 | { | ||
1710 | if (parcel.LandData.GlobalID != land.LandData.GlobalID) | ||
1711 | { | ||
1712 | if (parcel.IsEitherBannedOrRestricted(targetAvatar.UUID) != true) | ||
1713 | { | ||
1714 | for (int x = 1; x <= Constants.RegionSize; x += 2) | ||
1715 | { | ||
1716 | for (int y = 1; y <= Constants.RegionSize; y += 2) | ||
1717 | { | ||
1718 | if (parcel.ContainsPoint(x, y)) | ||
1719 | { | ||
1720 | position = new Vector3(x, y, targetAvatar.AbsolutePosition.Z); | ||
1721 | targetAvatar.TeleportWithMomentum(position); | ||
1722 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1723 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); | ||
1724 | return; | ||
1725 | } | ||
1726 | } | ||
1727 | } | ||
1728 | } | ||
1729 | } | ||
1730 | } | ||
1731 | } | ||
1732 | Vector3 targetVector; | ||
1733 | if (targetAvatar.AbsolutePosition.X > targetAvatar.AbsolutePosition.Y) | ||
1734 | { | ||
1735 | if (targetAvatar.AbsolutePosition.X > .5 * Constants.RegionSize) | ||
1736 | { | ||
1737 | targetVector = new Vector3(Constants.RegionSize, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ; | ||
1738 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1739 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1740 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); | ||
1741 | return; | ||
1742 | } | ||
1743 | else | ||
1744 | { | ||
1745 | targetVector = new Vector3(0, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ; | ||
1746 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1747 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1748 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); | ||
1749 | return; | ||
1750 | } | ||
1751 | } | ||
1752 | else | ||
1753 | { | ||
1754 | if (targetAvatar.AbsolutePosition.Y > .5 * Constants.RegionSize) | ||
1755 | { | ||
1756 | targetVector = new Vector3(targetAvatar.AbsolutePosition.X, Constants.RegionSize, targetAvatar.AbsolutePosition.Z); ; | ||
1757 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1758 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1759 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); | ||
1760 | return; | ||
1761 | } | ||
1762 | else | ||
1763 | { | ||
1764 | targetVector = new Vector3(targetAvatar.AbsolutePosition.X, 0, targetAvatar.AbsolutePosition.Z); ; | ||
1765 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1766 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1767 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); | ||
1768 | return; | ||
1769 | } | ||
1770 | } | ||
1771 | } | ||
1772 | } | ||
1773 | //Eject and ban | ||
1774 | if (flags == 1) | ||
1775 | { | ||
1776 | if (targetAvatar.GodLevel == 0) | ||
1777 | { | ||
1778 | ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); | ||
1779 | if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land)) | ||
1780 | return; | ||
1781 | |||
1782 | Vector3 position = new Vector3(0, 0, 0); | ||
1783 | List<ILandObject> allParcels = new List<ILandObject>(); | ||
1784 | allParcels = AllParcels(); | ||
1785 | if (allParcels.Count != 1) | ||
1786 | { | ||
1787 | foreach (ILandObject parcel in allParcels) | ||
1788 | { | ||
1789 | if (parcel.LandData.GlobalID != land.LandData.GlobalID) | ||
1790 | { | ||
1791 | if (parcel.IsEitherBannedOrRestricted(targetAvatar.UUID) != true) | ||
1792 | { | ||
1793 | for (int x = 1; x <= Constants.RegionSize; x += 2) | ||
1794 | { | ||
1795 | for (int y = 1; y <= Constants.RegionSize; y += 2) | ||
1796 | { | ||
1797 | if (parcel.ContainsPoint(x, y)) | ||
1798 | { | ||
1799 | position = new Vector3(x, y, targetAvatar.AbsolutePosition.Z); | ||
1800 | targetAvatar.TeleportWithMomentum(position); | ||
1801 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1802 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned."); | ||
1803 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | ||
1804 | entry.AgentID = targetAvatar.UUID; | ||
1805 | entry.Flags = AccessList.Ban; | ||
1806 | entry.Time = new DateTime(); | ||
1807 | land.LandData.ParcelAccessList.Add(entry); | ||
1808 | return; | ||
1809 | } | ||
1810 | } | ||
1811 | } | ||
1812 | } | ||
1813 | } | ||
1814 | } | ||
1815 | } | ||
1816 | Vector3 targetVector; | ||
1817 | if (targetAvatar.AbsolutePosition.X > targetAvatar.AbsolutePosition.Y) | ||
1818 | { | ||
1819 | if (targetAvatar.AbsolutePosition.X > .5 * Constants.RegionSize) | ||
1820 | { | ||
1821 | targetVector = new Vector3(Constants.RegionSize, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ; | ||
1822 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1823 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1824 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned."); | ||
1825 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | ||
1826 | entry.AgentID = targetAvatar.UUID; | ||
1827 | entry.Flags = AccessList.Ban; | ||
1828 | entry.Time = new DateTime(); | ||
1829 | land.LandData.ParcelAccessList.Add(entry); | ||
1830 | return; | ||
1831 | } | ||
1832 | else | ||
1833 | { | ||
1834 | targetVector = new Vector3(0, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ; | ||
1835 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1836 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1837 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned."); | ||
1838 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | ||
1839 | entry.AgentID = targetAvatar.UUID; | ||
1840 | entry.Flags = AccessList.Ban; | ||
1841 | entry.Time = new DateTime(); | ||
1842 | land.LandData.ParcelAccessList.Add(entry); | ||
1843 | return; | ||
1844 | } | ||
1845 | } | ||
1846 | else | ||
1847 | { | ||
1848 | if (targetAvatar.AbsolutePosition.Y > .5 * Constants.RegionSize) | ||
1849 | { | ||
1850 | targetVector = new Vector3(targetAvatar.AbsolutePosition.X, Constants.RegionSize, targetAvatar.AbsolutePosition.Z); ; | ||
1851 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1852 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1853 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned."); | ||
1854 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | ||
1855 | entry.AgentID = targetAvatar.UUID; | ||
1856 | entry.Flags = AccessList.Ban; | ||
1857 | entry.Time = new DateTime(); | ||
1858 | land.LandData.ParcelAccessList.Add(entry); | ||
1859 | return; | ||
1860 | } | ||
1861 | else | ||
1862 | { | ||
1863 | targetVector = new Vector3(targetAvatar.AbsolutePosition.X, 0, targetAvatar.AbsolutePosition.Z); ; | ||
1864 | targetAvatar.TeleportWithMomentum(targetVector); | ||
1865 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1866 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned."); | ||
1867 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | ||
1868 | entry.AgentID = targetAvatar.UUID; | ||
1869 | entry.Flags = AccessList.Ban; | ||
1870 | entry.Time = new DateTime(); | ||
1871 | land.LandData.ParcelAccessList.Add(entry); | ||
1872 | return; | ||
1873 | } | ||
1874 | } | ||
1875 | } | ||
1876 | } | ||
1877 | } | ||
1440 | } | 1878 | } |
1441 | } | 1879 | } |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 1fa8630..1c65965 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs | |||
@@ -267,11 +267,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
267 | 267 | ||
268 | public bool IsEitherBannedOrRestricted(UUID avatar) | 268 | public bool IsEitherBannedOrRestricted(UUID avatar) |
269 | { | 269 | { |
270 | if (IsBannedFromLand(avatar)) | 270 | if (IsRestrictedFromLand(avatar) || IsBannedFromLand(avatar)) |
271 | { | ||
272 | return true; | ||
273 | } | ||
274 | else if (IsRestrictedFromLand(avatar)) | ||
275 | { | 271 | { |
276 | return true; | 272 | return true; |
277 | } | 273 | } |
@@ -280,7 +276,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
280 | 276 | ||
281 | public bool IsBannedFromLand(UUID avatar) | 277 | public bool IsBannedFromLand(UUID avatar) |
282 | { | 278 | { |
283 | if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0) | 279 | ScenePresence SP = m_scene.GetScenePresence(avatar); |
280 | if ((LandData.Flags & (uint)ParcelFlags.UseBanList) > 0) | ||
284 | { | 281 | { |
285 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | 282 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); |
286 | entry.AgentID = avatar; | 283 | entry.AgentID = avatar; |
@@ -288,8 +285,22 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
288 | entry.Time = new DateTime(); | 285 | entry.Time = new DateTime(); |
289 | if (LandData.ParcelAccessList.Contains(entry)) | 286 | if (LandData.ParcelAccessList.Contains(entry)) |
290 | { | 287 | { |
291 | //They are banned, so lets send them a notice about this parcel | 288 | if ((LandData.Flags & (uint)ParcelFlags.UseAccessGroup) > 0) |
292 | return true; | 289 | { |
290 | if (LandData.GroupID == SP.ControllingClient.ActiveGroupId) | ||
291 | { | ||
292 | return false; | ||
293 | } | ||
294 | else | ||
295 | { | ||
296 | //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel | ||
297 | return true; | ||
298 | } | ||
299 | } | ||
300 | else | ||
301 | { | ||
302 | return true; | ||
303 | } | ||
293 | } | 304 | } |
294 | } | 305 | } |
295 | return false; | 306 | return false; |
@@ -297,7 +308,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
297 | 308 | ||
298 | public bool IsRestrictedFromLand(UUID avatar) | 309 | public bool IsRestrictedFromLand(UUID avatar) |
299 | { | 310 | { |
300 | if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0) | 311 | ScenePresence SP = m_scene.GetScenePresence(avatar); |
312 | if ((LandData.Flags & (uint)ParcelFlags.UseAccessList) > 0) | ||
301 | { | 313 | { |
302 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | 314 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); |
303 | entry.AgentID = avatar; | 315 | entry.AgentID = avatar; |
@@ -305,8 +317,22 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
305 | entry.Time = new DateTime(); | 317 | entry.Time = new DateTime(); |
306 | if (!LandData.ParcelAccessList.Contains(entry)) | 318 | if (!LandData.ParcelAccessList.Contains(entry)) |
307 | { | 319 | { |
308 | //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel | 320 | if ((LandData.Flags & (uint)ParcelFlags.UseAccessGroup) > 0) |
309 | return true; | 321 | { |
322 | if (LandData.GroupID == SP.ControllingClient.ActiveGroupId) | ||
323 | { | ||
324 | return false; | ||
325 | } | ||
326 | else | ||
327 | { | ||
328 | //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel | ||
329 | return true; | ||
330 | } | ||
331 | } | ||
332 | else | ||
333 | { | ||
334 | return true; | ||
335 | } | ||
310 | } | 336 | } |
311 | } | 337 | } |
312 | return false; | 338 | return false; |
diff --git a/OpenSim/Region/CoreModules/World/Meta7Windlight/Meta7WindlightModule.cs b/OpenSim/Region/CoreModules/World/Meta7Windlight/Meta7WindlightModule.cs new file mode 100644 index 0000000..72b0b38 --- /dev/null +++ b/OpenSim/Region/CoreModules/World/Meta7Windlight/Meta7WindlightModule.cs | |||
@@ -0,0 +1,274 @@ | |||
1 | /* | ||
2 | * Copyright (c) Thomas Grimshaw and Magne Metaverse Research | ||
3 | * | ||
4 | * This module is not open source. All rights reserved. | ||
5 | * Unauthorised copying, distribution or public display is prohibited. | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | using System; | ||
10 | using System.Collections.Generic; | ||
11 | using System.IO; | ||
12 | using System.Reflection; | ||
13 | using OpenMetaverse; | ||
14 | using log4net; | ||
15 | using Nini.Config; | ||
16 | using OpenSim.Data; | ||
17 | using OpenSim.Framework; | ||
18 | using OpenSim.Region.CoreModules.Framework.InterfaceCommander; | ||
19 | using OpenSim.Region.Framework.Interfaces; | ||
20 | using OpenSim.Region.Framework.Scenes; | ||
21 | |||
22 | |||
23 | namespace OpenSim.Region.CoreModules.World.Meta7Windlight | ||
24 | { | ||
25 | public class Meta7WindlightModule : IRegionModule, ICommandableModule | ||
26 | { | ||
27 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
28 | private readonly Commander m_commander = new Commander("windlight"); | ||
29 | private Scene m_scene; | ||
30 | private static bool m_enableWindlight; | ||
31 | |||
32 | #region ICommandableModule Members | ||
33 | |||
34 | public ICommander CommandInterface | ||
35 | { | ||
36 | get { return m_commander; } | ||
37 | } | ||
38 | |||
39 | #endregion | ||
40 | |||
41 | #region IRegionModule Members | ||
42 | |||
43 | public static bool EnableWindlight | ||
44 | { | ||
45 | get | ||
46 | { | ||
47 | return m_enableWindlight; | ||
48 | } | ||
49 | set | ||
50 | { | ||
51 | } | ||
52 | } | ||
53 | |||
54 | public void Initialise(Scene scene, IConfigSource config) | ||
55 | { | ||
56 | m_scene = scene; | ||
57 | m_scene.RegisterModuleInterface<IRegionModule>(this); | ||
58 | m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole; | ||
59 | |||
60 | // ini file settings | ||
61 | try | ||
62 | { | ||
63 | m_enableWindlight = config.Configs["Meta7Windlight"].GetBoolean("enable_windlight", false); | ||
64 | } | ||
65 | catch (Exception) | ||
66 | { | ||
67 | m_log.Debug("[WINDLIGHT]: ini failure for enable_windlight - using default"); | ||
68 | } | ||
69 | |||
70 | if (m_enableWindlight) | ||
71 | { | ||
72 | m_scene.EventManager.OnMakeRootAgent += EventManager_OnMakeRootAgent; | ||
73 | m_scene.EventManager.OnSaveNewWindlightProfile += EventManager_OnSaveNewWindlightProfile; | ||
74 | m_scene.EventManager.OnSendNewWindlightProfileTargeted += EventManager_OnSendNewWindlightProfileTargeted; | ||
75 | } | ||
76 | |||
77 | InstallCommands(); | ||
78 | |||
79 | m_log.Debug("[WINDLIGHT]: Initialised windlight module"); | ||
80 | } | ||
81 | |||
82 | private List<byte[]> compileWindlightSettings(RegionMeta7WindlightData wl) | ||
83 | { | ||
84 | byte[] mBlock = new Byte[249]; | ||
85 | int pos = 0; | ||
86 | |||
87 | wl.waterColor.ToBytes(mBlock, 0); pos += 12; | ||
88 | Utils.FloatToBytes(wl.waterFogDensityExponent).CopyTo(mBlock, pos); pos += 4; | ||
89 | Utils.FloatToBytes(wl.underwaterFogModifier).CopyTo(mBlock, pos); pos += 4; | ||
90 | wl.reflectionWaveletScale.ToBytes(mBlock, pos); pos += 12; | ||
91 | Utils.FloatToBytes(wl.fresnelScale).CopyTo(mBlock, pos); pos += 4; | ||
92 | Utils.FloatToBytes(wl.fresnelOffset).CopyTo(mBlock, pos); pos += 4; | ||
93 | Utils.FloatToBytes(wl.refractScaleAbove).CopyTo(mBlock, pos); pos += 4; | ||
94 | Utils.FloatToBytes(wl.refractScaleBelow).CopyTo(mBlock, pos); pos += 4; | ||
95 | Utils.FloatToBytes(wl.blurMultiplier).CopyTo(mBlock, pos); pos += 4; | ||
96 | wl.bigWaveDirection.ToBytes(mBlock, pos); pos += 8; | ||
97 | wl.littleWaveDirection.ToBytes(mBlock, pos); pos += 8; | ||
98 | wl.normalMapTexture.ToBytes(mBlock, pos); pos += 16; | ||
99 | wl.horizon.ToBytes(mBlock, pos); pos += 16; | ||
100 | Utils.FloatToBytes(wl.hazeHorizon).CopyTo(mBlock, pos); pos += 4; | ||
101 | wl.blueDensity.ToBytes(mBlock, pos); pos += 16; | ||
102 | Utils.FloatToBytes(wl.hazeDensity).CopyTo(mBlock, pos); pos += 4; | ||
103 | Utils.FloatToBytes(wl.densityMultiplier).CopyTo(mBlock, pos); pos += 4; | ||
104 | Utils.FloatToBytes(wl.distanceMultiplier).CopyTo(mBlock, pos); pos += 4; | ||
105 | wl.sunMoonColor.ToBytes(mBlock, pos); pos += 16; | ||
106 | Utils.FloatToBytes(wl.sunMoonPosition).CopyTo(mBlock, pos); pos += 4; | ||
107 | wl.ambient.ToBytes(mBlock, pos); pos += 16; | ||
108 | Utils.FloatToBytes(wl.eastAngle).CopyTo(mBlock, pos); pos += 4; | ||
109 | Utils.FloatToBytes(wl.sunGlowFocus).CopyTo(mBlock, pos); pos += 4; | ||
110 | Utils.FloatToBytes(wl.sunGlowSize).CopyTo(mBlock, pos); pos += 4; | ||
111 | Utils.FloatToBytes(wl.sceneGamma).CopyTo(mBlock, pos); pos += 4; | ||
112 | Utils.FloatToBytes(wl.starBrightness).CopyTo(mBlock, pos); pos += 4; | ||
113 | wl.cloudColor.ToBytes(mBlock, pos); pos += 16; | ||
114 | wl.cloudXYDensity.ToBytes(mBlock, pos); pos += 12; | ||
115 | Utils.FloatToBytes(wl.cloudCoverage).CopyTo(mBlock, pos); pos += 4; | ||
116 | Utils.FloatToBytes(wl.cloudScale).CopyTo(mBlock, pos); pos += 4; | ||
117 | wl.cloudDetailXYDensity.ToBytes(mBlock, pos); pos += 12; | ||
118 | Utils.FloatToBytes(wl.cloudScrollX).CopyTo(mBlock, pos); pos += 4; | ||
119 | Utils.FloatToBytes(wl.cloudScrollY).CopyTo(mBlock, pos); pos += 4; | ||
120 | Utils.UInt16ToBytes(wl.maxAltitude).CopyTo(mBlock, pos); pos += 2; | ||
121 | mBlock[pos] = Convert.ToByte(wl.cloudScrollXLock); pos++; | ||
122 | mBlock[pos] = Convert.ToByte(wl.cloudScrollYLock); pos++; | ||
123 | mBlock[pos] = Convert.ToByte(wl.drawClassicClouds); pos++; | ||
124 | List<byte[]> param = new List<byte[]>(); | ||
125 | param.Add(mBlock); | ||
126 | return param; | ||
127 | } | ||
128 | public void SendProfileToClient(ScenePresence presence) | ||
129 | { | ||
130 | IClientAPI client = presence.ControllingClient; | ||
131 | if (m_enableWindlight) | ||
132 | { | ||
133 | if (presence.IsChildAgent == false) | ||
134 | { | ||
135 | List<byte[]> param = compileWindlightSettings(m_scene.RegionInfo.WindlightSettings); | ||
136 | client.SendGenericMessage("Windlight", param); | ||
137 | } | ||
138 | } | ||
139 | else | ||
140 | { | ||
141 | //We probably don't want to spam chat with this.. probably | ||
142 | //m_log.Debug("[WINDLIGHT]: Module disabled"); | ||
143 | } | ||
144 | } | ||
145 | public void SendProfileToClient(ScenePresence presence, RegionMeta7WindlightData wl) | ||
146 | { | ||
147 | IClientAPI client = presence.ControllingClient; | ||
148 | if (m_enableWindlight) | ||
149 | { | ||
150 | if (presence.IsChildAgent == false) | ||
151 | { | ||
152 | List<byte[]> param = compileWindlightSettings(wl); | ||
153 | client.SendGenericMessage("Windlight", param); | ||
154 | } | ||
155 | } | ||
156 | else | ||
157 | { | ||
158 | //We probably don't want to spam chat with this.. probably | ||
159 | //m_log.Debug("[WINDLIGHT]: Module disabled"); | ||
160 | } | ||
161 | } | ||
162 | private void EventManager_OnMakeRootAgent(ScenePresence presence) | ||
163 | { | ||
164 | m_log.Debug("[WINDLIGHT]: Sending windlight scene to new client"); | ||
165 | SendProfileToClient(presence); | ||
166 | } | ||
167 | private void EventManager_OnSendNewWindlightProfileTargeted(RegionMeta7WindlightData wl, UUID pUUID) | ||
168 | { | ||
169 | ScenePresence Sc; | ||
170 | if (m_scene.TryGetAvatar(pUUID,out Sc)) | ||
171 | { | ||
172 | SendProfileToClient(Sc,wl); | ||
173 | } | ||
174 | } | ||
175 | private void EventManager_OnSaveNewWindlightProfile() | ||
176 | { | ||
177 | m_scene.ForEachScenePresence(SendProfileToClient); | ||
178 | } | ||
179 | |||
180 | public void PostInitialise() | ||
181 | { | ||
182 | |||
183 | } | ||
184 | |||
185 | public void Close() | ||
186 | { | ||
187 | } | ||
188 | |||
189 | public string Name | ||
190 | { | ||
191 | get { return "Meta7WindlightModule"; } | ||
192 | } | ||
193 | |||
194 | public bool IsSharedModule | ||
195 | { | ||
196 | get { return false; } | ||
197 | } | ||
198 | |||
199 | #endregion | ||
200 | |||
201 | #region events | ||
202 | |||
203 | #endregion | ||
204 | |||
205 | #region ICommandableModule Members | ||
206 | |||
207 | private void InstallCommands() | ||
208 | { | ||
209 | Command wlload = new Command("load", CommandIntentions.COMMAND_NON_HAZARDOUS, HandleLoad, "Load windlight profile from the database and broadcast"); | ||
210 | Command wlenable = new Command("enable", CommandIntentions.COMMAND_NON_HAZARDOUS, HandleEnable, "Enable the windlight plugin"); | ||
211 | Command wldisable = new Command("disable", CommandIntentions.COMMAND_NON_HAZARDOUS, HandleDisable, "Enable the windlight plugin"); | ||
212 | |||
213 | m_commander.RegisterCommand("load", wlload); | ||
214 | m_commander.RegisterCommand("enable", wlenable); | ||
215 | m_commander.RegisterCommand("disable", wldisable); | ||
216 | |||
217 | m_scene.RegisterModuleCommander(m_commander); | ||
218 | } | ||
219 | |||
220 | private void HandleLoad(Object[] args) | ||
221 | { | ||
222 | if (!m_enableWindlight) | ||
223 | { | ||
224 | m_log.InfoFormat("[WINDLIGHT]: Cannot load windlight profile, module disabled. Use 'windlight enable' first."); | ||
225 | } | ||
226 | else | ||
227 | { | ||
228 | m_log.InfoFormat("[WINDLIGHT]: Loading Windlight profile from database"); | ||
229 | m_scene.LoadWindlightProfile(); | ||
230 | m_log.InfoFormat("[WINDLIGHT]: Load complete"); | ||
231 | } | ||
232 | } | ||
233 | |||
234 | private void HandleDisable(Object[] args) | ||
235 | { | ||
236 | m_log.InfoFormat("[WINDLIGHT]: Plugin now disabled"); | ||
237 | m_enableWindlight=false; | ||
238 | } | ||
239 | |||
240 | private void HandleEnable(Object[] args) | ||
241 | { | ||
242 | m_log.InfoFormat("[WINDLIGHT]: Plugin now enabled"); | ||
243 | m_enableWindlight = true; | ||
244 | } | ||
245 | |||
246 | /// <summary> | ||
247 | /// Processes commandline input. Do not call directly. | ||
248 | /// </summary> | ||
249 | /// <param name="args">Commandline arguments</param> | ||
250 | private void EventManager_OnPluginConsole(string[] args) | ||
251 | { | ||
252 | if (args[0] == "windlight") | ||
253 | { | ||
254 | if (args.Length == 1) | ||
255 | { | ||
256 | m_commander.ProcessConsoleCommand("add", new string[0]); | ||
257 | return; | ||
258 | } | ||
259 | |||
260 | string[] tmpArgs = new string[args.Length - 2]; | ||
261 | int i; | ||
262 | for (i = 2; i < args.Length; i++) | ||
263 | { | ||
264 | tmpArgs[i - 2] = args[i]; | ||
265 | } | ||
266 | |||
267 | m_commander.ProcessConsoleCommand(args[1], tmpArgs); | ||
268 | } | ||
269 | } | ||
270 | #endregion | ||
271 | |||
272 | } | ||
273 | } | ||
274 | |||