/*
* Copyright (c) Contributors, http://www.openmetaverse.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
using System;
using System.IO;
using System.Collections.Generic;
using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Framework.Interfaces;
using OpenSim.Framework.Types;
using OpenSim.Framework.Communications.Caches;
using OpenSim.Framework.Data;
namespace OpenSim.Region.Environment.Scenes
{
public partial class Scene
{
///
/// Modifies terrain using the specified information
///
/// The height at which the user started modifying the terrain
/// The number of seconds the modify button was pressed
/// The size of the brush used
/// The action to be performed
/// Distance from the north border where the cursor is located
/// Distance from the west border where the cursor is located
public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west, IClientAPI remoteUser)
{
// Shiny.
double size = (double)(1 << brushsize);
switch (action)
{
case 0:
// flatten terrain
Terrain.FlattenTerrain(north, west, size, (double)seconds / 5.0);
break;
case 1:
// raise terrain
Terrain.RaiseTerrain(north, west, size, (double)seconds / 5.0);
break;
case 2:
//lower terrain
Terrain.LowerTerrain(north, west, size, (double)seconds / 5.0);
break;
case 3:
// smooth terrain
Terrain.SmoothTerrain(north, west, size, (double)seconds / 5.0);
break;
case 4:
// noise
Terrain.NoiseTerrain(north, west, size, (double)seconds / 5.0);
break;
case 5:
// revert
Terrain.RevertTerrain(north, west, size, (double)seconds / 5.0);
break;
// CLIENT EXTENSIONS GO HERE
case 128:
// erode-thermal
break;
case 129:
// erode-aerobic
break;
case 130:
// erode-hydraulic
break;
}
for (int x = 0; x < 16; x++)
{
for (int y = 0; y < 16; y++)
{
if (Terrain.Tainted(x * 16, y * 16))
{
remoteUser.SendLayerData(x, y, Terrain.GetHeights1D());
}
}
}
return;
}
///
///
///
/// Inefficient. TODO: Fixme
///
///
///
///
///
public void InstantMessage(LLUUID fromAgentID, LLUUID toAgentID, uint timestamp, string fromAgentName, string message)
{
if (this.Avatars.ContainsKey(toAgentID))
{
if (this.Avatars.ContainsKey(fromAgentID))
{
// Local sim message
ScenePresence fromAvatar = this.Avatars[fromAgentID];
ScenePresence toAvatar = this.Avatars[toAgentID];
string fromName = fromAvatar.firstname + " " + fromAvatar.lastname;
toAvatar.ControllingClient.SendInstantMessage(message, toAgentID, fromName);
}
else
{
// Message came from a user outside the sim, ignore?
}
}
else
{
// Grid message
}
}
///
///
///
///
///
///
///
///
public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
{
ScenePresence avatar = null;
if (this.Avatars.ContainsKey(fromAgentID))
{
avatar = this.Avatars[fromAgentID];
fromPos = avatar.Pos;
fromName = avatar.firstname + " " + avatar.lastname;
avatar = null;
}
this.ForEachScenePresence(delegate(ScenePresence presence)
{
int dis = -1000;
if (this.Avatars.ContainsKey(presence.ControllingClient.AgentId))
{
avatar = this.Avatars[presence.ControllingClient.AgentId];
dis = (int)avatar.Pos.GetDistanceTo(fromPos);
}
switch (type)
{
case 0: // Whisper
if ((dis < 10) && (dis > -10))
{
//should change so the message is sent through the avatar rather than direct to the ClientView
presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName,
fromAgentID);
}
break;
case 1: // Say
if ((dis < 30) && (dis > -30))
{
//Console.WriteLine("sending chat");
presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName,
fromAgentID);
}
break;
case 2: // Shout
if ((dis < 100) && (dis > -100))
{
presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName,
fromAgentID);
}
break;
case 0xff: // Broadcast
presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName,
fromAgentID);
break;
}
});
}
///
///
///
///
///
public void RezObject(AssetBase primAsset, LLVector3 pos)
{
}
///
///
///
///
///
public void DeRezObject(Packet packet, IClientAPI simClient)
{
}
///
///
///
///
public void SendAvatarsToClient(IClientAPI remoteClient)
{
}
///
///
///
///
///
///
public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags)
{
SceneObject originPrim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
if (((SceneObject)ent).rootLocalID == originalPrim)
{
originPrim = (SceneObject)ent;
break;
}
}
}
if (originPrim != null)
{
SceneObject copy = originPrim.Copy();
copy.Pos = copy.Pos + offset;
this.Entities.Add(copy.rootUUID, copy);
List avatars = this.RequestAvatarList();
for (int i = 0; i < avatars.Count; i++)
{
copy.SendAllChildPrimsToClient(avatars[i].ControllingClient);
}
}
else
{
OpenSim.Framework.Console.MainLog.Instance.Warn("client", "Attempted to duplicate nonexistant prim");
}
}
///
///
///
///
///
public void LinkObjects(uint parentPrim, List childPrims)
{
SceneObject parenPrim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
if (((SceneObject)ent).rootLocalID == parentPrim)
{
parenPrim = (SceneObject)ent;
break;
}
}
}
List children = new List();
if (parenPrim != null)
{
for (int i = 0; i < childPrims.Count; i++)
{
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
if (((SceneObject)ent).rootLocalID == childPrims[i])
{
children.Add((SceneObject)ent);
}
}
}
}
}
foreach (SceneObject sceneObj in children)
{
parenPrim.AddNewChildPrims(sceneObj);
}
}
///
///
///
///
///
public void UpdatePrimShape(uint primLocalID, ObjectShapePacket.ObjectDataBlock shapeBlock)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(primLocalID);
if (prim != null)
{
prim.UpdateShape(shapeBlock);
break;
}
}
}
}
public void UpdateExtraParam(uint primLocalID, ushort type, bool inUse, byte[] data)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(primLocalID);
if (prim != null)
{
prim.UpdateExtraParam(type, inUse, data);
break;
}
}
}
}
///
///
///
///
///
public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(primLocalID);
if (prim != null)
{
prim.GetInventory(remoteClient, primLocalID);
break;
}
}
}
}
///
///
///
///
///
public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
{
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
if (((SceneObject)ent).rootLocalID == primLocalID)
{
((SceneObject)ent).GetProperites(remoteClient);
((SceneObject)ent).isSelected = true;
this.LandManager.setPrimsTainted();
break;
}
}
}
}
///
///
///
///
///
public void DeselectPrim(uint primLocalID, IClientAPI remoteClient)
{
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
if (((SceneObject)ent).rootLocalID == primLocalID)
{
((SceneObject)ent).isSelected = false;
this.LandManager.setPrimsTainted();
break;
}
}
}
}
///
///
///
///
///
public void PrimDescription(uint primLocalID, string description)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(primLocalID);
if (prim != null)
{
prim.Description = description;
break;
}
}
}
}
///
///
///
///
///
public void PrimName(uint primLocalID, string name)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(primLocalID);
if (prim != null)
{
prim.Name = name;
break;
}
}
}
}
public void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(objectID);
if (prim != null)
{
((SceneObject)ent).GrapMovement(offset, pos, remoteClient);
break;
}
}
}
/*
if (this.Entities.ContainsKey(objectID))
{
if (this.Entities[objectID] is SceneObject)
{
((SceneObject)this.Entities[objectID]).GrapMovement(offset, pos, remoteClient);
}
}*/
}
///
///
///
///
///
///
public void UpdatePrimFlags(uint localID, Packet packet, IClientAPI remoteClient)
{
}
///
///
///
///
///
///
public void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateTextureEntry(texture);
}
}
}
}
///
///
///
///
///
///
public void UpdatePrimPosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateGroupPosition(pos);
break;
}
}
}
}
public void UpdatePrimSinglePosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateSinglePosition(pos);
break;
}
}
}
}
///
///
///
///
///
///
///
public void UpdatePrimRotation(uint localID, LLVector3 pos, LLQuaternion rot, IClientAPI remoteClient)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateGroupMouseRotation(pos, rot);
break;
}
}
}
}
///
///
///
///
///
///
public void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateGroupRotation(rot);
break;
}
}
}
}
///
///
///
///
///
///
public void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
{
//Console.WriteLine("trying to update single prim rotation");
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateSingleRotation(rot);
break;
}
}
}
}
///
///
///
///
///
///
public void UpdatePrimScale(uint localID, LLVector3 scale, IClientAPI remoteClient)
{
Primitive prim = null;
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObject)
{
prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.ResizeGoup(scale);
break;
}
}
}
}
///
/// temporary method to test out creating new inventory items
///
///
///
///
///
///
///
///
///
///
///
public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID, uint callbackID, string description, string name, sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask)
{
CachedUserInfo userInfo = commsManager.UserProfiles.GetUserDetails(remoteClient.AgentId);
if (userInfo != null)
{
AssetBase asset = new AssetBase();
asset.Name = name;
asset.Description = description;
asset.InvType = invType;
asset.Type = type;
asset.FullID = LLUUID.Random();
asset.Data = new byte[0];
this.assetCache.AddAsset(asset);
InventoryItemBase item = new InventoryItemBase();
item.avatarID = remoteClient.AgentId;
item.creatorsID = remoteClient.AgentId;
item.inventoryID = LLUUID.Random();
item.assetID = asset.FullID;
item.inventoryDescription = description;
item.inventoryName = name;
item.assetType = invType;
item.parentFolderID = folderID;
item.inventoryCurrentPermissions = 2147483647;
item.inventoryNextPermissions = nextOwnerMask;
userInfo.ItemReceive(remoteClient.AgentId, item);
remoteClient.SendInventoryItemUpdate(item);
}
}
///
/// Sends prims to a client
///
/// Client to send to
public void GetInitialPrims(IClientAPI RemoteClient)
{
}
}
}