* HttpRequestSignature uses regular expressions for the path now

* Added a simplified HttpListener.AddHandler() overload
* Lots of improvements in ExtensionLoader, simplified interface
* Updated Simian to latest ExtensionLoader

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2316 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2008-10-29 20:11:28 +00:00
parent ce99ebcab7
commit dad28f767a
23 changed files with 357 additions and 331 deletions

View File

@@ -6,18 +6,18 @@ using OpenMetaverse.StructuredData;
namespace Simian.Extensions
{
public class AccountManager : IExtension, IAccountProvider, IPersistable
public class AccountManager : IExtension<Simian>, IAccountProvider, IPersistable
{
Simian server;
DoubleDictionary<string, UUID, Agent> accounts = new DoubleDictionary<string, UUID, Agent>();
public AccountManager(Simian server)
public AccountManager()
{
this.server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
}
public void Stop()

View File

@@ -8,28 +8,29 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class AssetManager : IExtension, IAssetProvider
public class AssetManager : IExtension<Simian>, IAssetProvider
{
public const string UPLOAD_DIR = "uploadedAssets";
Simian Server;
Simian server;
Dictionary<UUID, Asset> AssetStore = new Dictionary<UUID, Asset>();
Dictionary<ulong, Asset> CurrentUploads = new Dictionary<ulong, Asset>();
string UploadDir;
public AssetManager(Simian server)
public AssetManager()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
UploadDir = Path.Combine(Server.DataDir, UPLOAD_DIR);
this.server = server;
UploadDir = Path.Combine(server.DataDir, UPLOAD_DIR);
// Try to create the data directories if they don't already exist
if (!Directory.Exists(Server.DataDir))
if (!Directory.Exists(server.DataDir))
{
try { Directory.CreateDirectory(Server.DataDir); }
try { Directory.CreateDirectory(server.DataDir); }
catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Warning, ex); }
}
if (!Directory.Exists(UploadDir))
@@ -38,13 +39,13 @@ namespace Simian.Extensions
catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Warning, ex); }
}
LoadAssets(Server.DataDir);
LoadAssets(server.DataDir);
LoadAssets(UploadDir);
Server.UDP.RegisterPacketCallback(PacketType.AssetUploadRequest, new PacketCallback(AssetUploadRequestHandler));
Server.UDP.RegisterPacketCallback(PacketType.SendXferPacket, new PacketCallback(SendXferPacketHandler));
Server.UDP.RegisterPacketCallback(PacketType.AbortXfer, new PacketCallback(AbortXferHandler));
Server.UDP.RegisterPacketCallback(PacketType.TransferRequest, new PacketCallback(TransferRequestHandler));
server.UDP.RegisterPacketCallback(PacketType.AssetUploadRequest, new PacketCallback(AssetUploadRequestHandler));
server.UDP.RegisterPacketCallback(PacketType.SendXferPacket, new PacketCallback(SendXferPacketHandler));
server.UDP.RegisterPacketCallback(PacketType.AbortXfer, new PacketCallback(AbortXferHandler));
server.UDP.RegisterPacketCallback(PacketType.TransferRequest, new PacketCallback(TransferRequestHandler));
}
public void Stop()
@@ -122,7 +123,7 @@ namespace Simian.Extensions
complete.AssetBlock.Success = true;
complete.AssetBlock.Type = request.AssetBlock.Type;
complete.AssetBlock.UUID = assetID;
Server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Inventory);
server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Inventory);
}
else
{
@@ -151,7 +152,7 @@ namespace Simian.Extensions
lock (CurrentUploads)
CurrentUploads[xfer.XferID.ID] = asset;
Server.UDP.SendPacket(agent.AgentID, xfer, PacketCategory.Inventory);
server.UDP.SendPacket(agent.AgentID, xfer, PacketCategory.Inventory);
}
}
@@ -180,7 +181,7 @@ namespace Simian.Extensions
ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket();
confirm.XferID.ID = xfer.XferID.ID;
confirm.XferID.Packet = xfer.XferID.Packet;
Server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset);
server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset);
}
else
{
@@ -191,7 +192,7 @@ namespace Simian.Extensions
ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket();
confirm.XferID.ID = xfer.XferID.ID;
confirm.XferID.Packet = xfer.XferID.Packet;
Server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset);
server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset);
if ((xfer.XferID.Packet & (uint)0x80000000) != 0)
{
@@ -207,7 +208,7 @@ namespace Simian.Extensions
complete.AssetBlock.Success = true;
complete.AssetBlock.Type = (sbyte)asset.AssetType;
complete.AssetBlock.UUID = asset.AssetID;
Server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Asset);
server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Asset);
}
}
}
@@ -283,7 +284,7 @@ namespace Simian.Extensions
response.TransferInfo.Status = (int)StatusCode.OK;
response.TransferInfo.TargetType = (int)TargetType.Unknown; // Doesn't seem to be used by the client
Server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset);
server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset);
// Transfer system does not wait for ACKs, just sends all of the
// packets for this transfer out
@@ -307,7 +308,7 @@ namespace Simian.Extensions
else
transfer.TransferData.Status = (int)StatusCode.OK;
Server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Asset);
server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Asset);
}
}
else
@@ -327,7 +328,7 @@ namespace Simian.Extensions
response.TransferInfo.Status = (int)StatusCode.UnknownSource;
response.TransferInfo.TargetType = (int)TargetType.Unknown;
Server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset);
server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset);
}
}
else if (source == SourceType.SimEstate)

View File

@@ -4,17 +4,17 @@ using OpenMetaverse;
namespace Simian.Extensions
{
public class AuthFreeForAll : IExtension, IAuthenticationProvider
public class AuthFreeForAll : IExtension<Simian>, IAuthenticationProvider
{
Simian server;
public AuthFreeForAll(Simian server)
public AuthFreeForAll()
{
this.server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
}
public void Stop()

View File

@@ -8,28 +8,29 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
class AvatarManager : IExtension, IAvatarProvider
class AvatarManager : IExtension<Simian>, IAvatarProvider
{
Simian Server;
Simian server;
int currentWearablesSerialNum = -1;
int currentAnimSequenceNum = 0;
public AvatarManager(Simian server)
public AvatarManager()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
Server.UDP.RegisterPacketCallback(PacketType.AvatarPropertiesRequest, new PacketCallback(AvatarPropertiesRequestHandler));
Server.UDP.RegisterPacketCallback(PacketType.AgentWearablesRequest, new PacketCallback(AgentWearablesRequestHandler));
Server.UDP.RegisterPacketCallback(PacketType.AgentIsNowWearing, new PacketCallback(AgentIsNowWearingHandler));
Server.UDP.RegisterPacketCallback(PacketType.AgentSetAppearance, new PacketCallback(AgentSetAppearanceHandler));
Server.UDP.RegisterPacketCallback(PacketType.AgentCachedTexture, new PacketCallback(AgentCachedTextureHandler));
Server.UDP.RegisterPacketCallback(PacketType.AgentAnimation, new PacketCallback(AgentAnimationHandler));
Server.UDP.RegisterPacketCallback(PacketType.SoundTrigger, new PacketCallback(SoundTriggerHandler));
Server.UDP.RegisterPacketCallback(PacketType.ViewerEffect, new PacketCallback(ViewerEffectHandler));
Server.UDP.RegisterPacketCallback(PacketType.UUIDNameRequest, new PacketCallback(UUIDNameRequestHandler));
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.AvatarPropertiesRequest, new PacketCallback(AvatarPropertiesRequestHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentWearablesRequest, new PacketCallback(AgentWearablesRequestHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentIsNowWearing, new PacketCallback(AgentIsNowWearingHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentSetAppearance, new PacketCallback(AgentSetAppearanceHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentCachedTexture, new PacketCallback(AgentCachedTextureHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentAnimation, new PacketCallback(AgentAnimationHandler));
server.UDP.RegisterPacketCallback(PacketType.SoundTrigger, new PacketCallback(SoundTriggerHandler));
server.UDP.RegisterPacketCallback(PacketType.ViewerEffect, new PacketCallback(ViewerEffectHandler));
server.UDP.RegisterPacketCallback(PacketType.UUIDNameRequest, new PacketCallback(UUIDNameRequestHandler));
}
public void Stop()
@@ -71,13 +72,13 @@ namespace Simian.Extensions
sendAnim.AnimationList[i].AnimSequenceID = sequenceNums[i];
}
Server.UDP.BroadcastPacket(sendAnim, PacketCategory.State);
server.UDP.BroadcastPacket(sendAnim, PacketCategory.State);
}
public void TriggerSound(Agent agent, UUID soundID, float gain)
{
SoundTriggerPacket sound = new SoundTriggerPacket();
sound.SoundData.Handle = Server.RegionHandle;
sound.SoundData.Handle = server.RegionHandle;
sound.SoundData.ObjectID = agent.AgentID;
sound.SoundData.ParentID = agent.AgentID;
sound.SoundData.OwnerID = agent.AgentID;
@@ -85,7 +86,7 @@ namespace Simian.Extensions
sound.SoundData.SoundID = soundID;
sound.SoundData.Gain = gain;
Server.UDP.BroadcastPacket(sound, PacketCategory.State);
server.UDP.BroadcastPacket(sound, PacketCategory.State);
}
void AgentAnimationHandler(Packet packet, Agent agent)
@@ -120,7 +121,7 @@ namespace Simian.Extensions
effect.AgentData.AgentID = UUID.Zero;
effect.AgentData.SessionID = UUID.Zero;
Server.UDP.BroadcastPacket(effect, PacketCategory.State);
server.UDP.BroadcastPacket(effect, PacketCategory.State);
}
void AvatarPropertiesRequestHandler(Packet packet, Agent agent)
@@ -128,7 +129,7 @@ namespace Simian.Extensions
AvatarPropertiesRequestPacket request = (AvatarPropertiesRequestPacket)packet;
Agent foundAgent;
if (Server.Agents.TryGetValue(request.AgentData.AvatarID, out foundAgent))
if (server.Agents.TryGetValue(request.AgentData.AvatarID, out foundAgent))
{
AvatarPropertiesReplyPacket reply = new AvatarPropertiesReplyPacket();
reply.AgentData.AgentID = agent.AgentID;
@@ -143,7 +144,7 @@ namespace Simian.Extensions
reply.PropertiesData.PartnerID = foundAgent.PartnerID;
reply.PropertiesData.ProfileURL = Utils.StringToBytes(foundAgent.ProfileURL);
Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction);
server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction);
}
else
{
@@ -155,7 +156,7 @@ namespace Simian.Extensions
bool TryAddWearable(UUID agentID, Dictionary<WearableType, InventoryItem> wearables, WearableType type, UUID itemID)
{
InventoryObject obj;
if (itemID != UUID.Zero && Server.Inventory.TryGetInventory(agentID, itemID, out obj) &&
if (itemID != UUID.Zero && server.Inventory.TryGetInventory(agentID, itemID, out obj) &&
obj is InventoryItem)
{
wearables.Add(type, (InventoryItem)obj);
@@ -212,7 +213,7 @@ namespace Simian.Extensions
Logger.DebugLog(String.Format("Sending info about {0} wearables", wearables.Count));
Server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Asset);
server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Asset);
}
void AgentWearablesRequestHandler(Packet packet, Agent agent)
@@ -304,7 +305,7 @@ namespace Simian.Extensions
for (int i = 0; i < set.VisualParam.Length; i++)
visualParams[i] = set.VisualParam[i].ParamValue;
Server.Scene.AvatarAppearance(this, agent, textureEntry, visualParams);
server.Scene.AvatarAppearance(this, agent, textureEntry, visualParams);
}
void AgentCachedTextureHandler(Packet packet, Agent agent)
@@ -328,7 +329,7 @@ namespace Simian.Extensions
response.Header.Zerocoded = true;
Server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Transaction);
server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Transaction);
}
void SoundTriggerHandler(Packet packet, Agent agent)
@@ -352,7 +353,7 @@ namespace Simian.Extensions
reply.UUIDNameBlock[i].ID = id;
Agent foundAgent;
if (Server.Agents.TryGetValue(id, out foundAgent))
if (server.Agents.TryGetValue(id, out foundAgent))
{
reply.UUIDNameBlock[i].FirstName = Utils.StringToBytes(foundAgent.FirstName);
reply.UUIDNameBlock[i].LastName = Utils.StringToBytes(foundAgent.LastName);
@@ -364,7 +365,7 @@ namespace Simian.Extensions
}
}
Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction);
server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction);
}
}
}

View File

@@ -8,18 +8,19 @@ using System.Threading;
namespace Simian.Extensions
{
public class CoarseLocationUpdates : IExtension
public class CoarseLocationUpdates : IExtension<Simian>
{
Simian Server;
Simian server;
Timer CoarseLocationTimer;
public CoarseLocationUpdates(Simian server)
public CoarseLocationUpdates()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
if (CoarseLocationTimer != null) CoarseLocationTimer = null;
CoarseLocationTimer = new Timer(new TimerCallback(CoarseLocationTimer_Elapsed));
CoarseLocationTimer.Change(1000, 1000);
@@ -32,9 +33,9 @@ namespace Simian.Extensions
void CoarseLocationTimer_Elapsed(object sender)
{
lock (Server.Agents)
lock (server.Agents)
{
foreach (Agent recipient in Server.Agents.Values)
foreach (Agent recipient in server.Agents.Values)
{
int i = 0;
@@ -42,8 +43,8 @@ namespace Simian.Extensions
update.Index.Prey = -1;
update.Index.You = 0;
update.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[Server.Agents.Count];
update.Location = new CoarseLocationUpdatePacket.LocationBlock[Server.Agents.Count];
update.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[server.Agents.Count];
update.Location = new CoarseLocationUpdatePacket.LocationBlock[server.Agents.Count];
// Fill in this avatar
update.AgentData[0] = new CoarseLocationUpdatePacket.AgentDataBlock();
@@ -54,7 +55,7 @@ namespace Simian.Extensions
update.Location[0].Z = (byte)((int)recipient.Avatar.Position.Z / 4);
++i;
foreach (Agent agent in Server.Agents.Values)
foreach (Agent agent in server.Agents.Values)
{
if (agent != recipient)
{
@@ -68,7 +69,7 @@ namespace Simian.Extensions
}
}
Server.UDP.SendPacket(recipient.AgentID, update, PacketCategory.State);
server.UDP.SendPacket(recipient.AgentID, update, PacketCategory.State);
}
}
}

View File

@@ -5,17 +5,18 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class ConnectionManagement : IExtension
public class ConnectionManagement : IExtension<Simian>
{
Simian server;
public ConnectionManagement(Simian server)
public ConnectionManagement()
{
this.server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.UseCircuitCode, new PacketCallback(UseCircuitCodeHandler));
server.UDP.RegisterPacketCallback(PacketType.StartPingCheck, new PacketCallback(StartPingCheckHandler));
server.UDP.RegisterPacketCallback(PacketType.LogoutRequest, new PacketCallback(LogoutRequestHandler));

View File

@@ -6,18 +6,20 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class FriendManager : IExtension
public class FriendManager : IExtension<Simian>
{
Simian Server;
Simian server;
public FriendManager(Simian server)
public FriendManager()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
Server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler));
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler));
}
public void Stop()
@@ -31,9 +33,9 @@ namespace Simian.Extensions
if (dialog == InstantMessageDialog.FriendshipOffered || dialog == InstantMessageDialog.FriendshipAccepted || dialog == InstantMessageDialog.FriendshipDeclined)
{
lock (Server.Agents)
lock (server.Agents)
{
foreach (Agent recipient in Server.Agents.Values)
foreach (Agent recipient in server.Agents.Values)
{
if (recipient.AgentID == im.MessageBlock.ToAgentID)
{
@@ -53,12 +55,12 @@ namespace Simian.Extensions
sendIM.AgentData.AgentID = agent.AgentID;
Server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction);
server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction);
if (dialog == InstantMessageDialog.FriendshipAccepted)
{
bool receiverOnline = Server.Agents.ContainsKey(agent.AgentID);
bool senderOnline = Server.Agents.ContainsKey(recipient.AgentID);
bool receiverOnline = server.Agents.ContainsKey(agent.AgentID);
bool senderOnline = server.Agents.ContainsKey(recipient.AgentID);
if (receiverOnline)
{
@@ -68,7 +70,7 @@ namespace Simian.Extensions
notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0];
notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock();
notify.AgentBlock[0].AgentID = agent.AgentID;
Server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State);
server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State);
}
else
{
@@ -76,7 +78,7 @@ namespace Simian.Extensions
notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0];
notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock();
notify.AgentBlock[0].AgentID = agent.AgentID;
Server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State);
server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State);
}
}
@@ -88,7 +90,7 @@ namespace Simian.Extensions
notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0];
notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock();
notify.AgentBlock[0].AgentID = recipient.AgentID;
Server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State);
server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State);
}
else
{
@@ -96,7 +98,7 @@ namespace Simian.Extensions
notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0];
notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock();
notify.AgentBlock[0].AgentID = recipient.AgentID;
Server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State);
server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State);
}
}

View File

@@ -81,20 +81,21 @@ namespace Simian.Extensions
}
}
public class ImageDelivery : IExtension
public class ImageDelivery : IExtension<Simian>
{
Simian Server;
Simian server;
Dictionary<UUID, ImageDownload> CurrentDownloads = new Dictionary<UUID, ImageDownload>();
BlockingQueue<ImageDownload> CurrentDownloadQueue = new BlockingQueue<ImageDownload>();
public ImageDelivery(Simian server)
public ImageDelivery()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
Server.UDP.RegisterPacketCallback(PacketType.RequestImage, new PacketCallback(RequestImageHandler));
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.RequestImage, new PacketCallback(RequestImageHandler));
}
public void Stop()
@@ -150,7 +151,7 @@ namespace Simian.Extensions
// New download, check if we have this image
Asset asset;
if (Server.Assets.TryGetAsset(block.Image, out asset) && asset is AssetTexture)
if (server.Assets.TryGetAsset(block.Image, out asset) && asset is AssetTexture)
{
download = new ImageDownload((AssetTexture)asset, block.DiscardLevel, block.DownloadPriority,
(int)block.Packet);
@@ -174,7 +175,7 @@ namespace Simian.Extensions
data.ImageData.Data = new byte[imageDataSize];
Buffer.BlockCopy(download.Texture.AssetData, 0, data.ImageData.Data, 0, imageDataSize);
Server.UDP.SendPacket(agent.AgentID, data, PacketCategory.Texture);
server.UDP.SendPacket(agent.AgentID, data, PacketCategory.Texture);
// Check if ImagePacket packets need to be sent to complete this transfer
if (download.CurrentPacket <= download.StopPacket)
@@ -204,7 +205,7 @@ namespace Simian.Extensions
Buffer.BlockCopy(download.Texture.AssetData, download.CurrentBytePosition(),
transfer.ImageData.Data, 0, imagePacketSize);
Server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Texture);
server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Texture);
++download.CurrentPacket;
}
@@ -225,7 +226,7 @@ namespace Simian.Extensions
ImageNotInDatabasePacket notfound = new ImageNotInDatabasePacket();
notfound.ImageID.ID = block.Image;
Server.UDP.SendPacket(agent.AgentID, notfound, PacketCategory.Texture);
server.UDP.SendPacket(agent.AgentID, notfound, PacketCategory.Texture);
}
}
}

View File

@@ -7,9 +7,9 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class InventoryManager : IExtension, IInventoryProvider, IPersistable
public class InventoryManager : IExtension<Simian>, IInventoryProvider, IPersistable
{
Simian Server;
Simian server;
/// <summary>Dictionary of inventories for each agent. Each inventory
/// is also a dictionary itself</summary>
Dictionary<UUID, Dictionary<UUID, InventoryObject>> Inventory =
@@ -17,22 +17,23 @@ namespace Simian.Extensions
/// <summary>Global shared inventory for all agent</summary>
Dictionary<UUID, InventoryObject> Library = new Dictionary<UUID, InventoryObject>();
public InventoryManager(Simian server)
public InventoryManager()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
Server.UDP.RegisterPacketCallback(PacketType.CreateInventoryItem, new PacketCallback(CreateInventoryItemHandler));
Server.UDP.RegisterPacketCallback(PacketType.CreateInventoryFolder, new PacketCallback(CreateInventoryFolderHandler));
Server.UDP.RegisterPacketCallback(PacketType.UpdateInventoryItem, new PacketCallback(UpdateInventoryItemHandler));
Server.UDP.RegisterPacketCallback(PacketType.FetchInventoryDescendents, new PacketCallback(FetchInventoryDescendentsHandler));
Server.UDP.RegisterPacketCallback(PacketType.FetchInventory, new PacketCallback(FetchInventoryHandler));
Server.UDP.RegisterPacketCallback(PacketType.CopyInventoryItem, new PacketCallback(CopyInventoryItemHandler));
Server.UDP.RegisterPacketCallback(PacketType.MoveInventoryItem, new PacketCallback(MoveInventoryItemHandler));
Server.UDP.RegisterPacketCallback(PacketType.MoveInventoryFolder, new PacketCallback(MoveInventoryFolderHandler));
Server.UDP.RegisterPacketCallback(PacketType.PurgeInventoryDescendents, new PacketCallback(PurgeInventoryDescendentsHandler));
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.CreateInventoryItem, new PacketCallback(CreateInventoryItemHandler));
server.UDP.RegisterPacketCallback(PacketType.CreateInventoryFolder, new PacketCallback(CreateInventoryFolderHandler));
server.UDP.RegisterPacketCallback(PacketType.UpdateInventoryItem, new PacketCallback(UpdateInventoryItemHandler));
server.UDP.RegisterPacketCallback(PacketType.FetchInventoryDescendents, new PacketCallback(FetchInventoryDescendentsHandler));
server.UDP.RegisterPacketCallback(PacketType.FetchInventory, new PacketCallback(FetchInventoryHandler));
server.UDP.RegisterPacketCallback(PacketType.CopyInventoryItem, new PacketCallback(CopyInventoryItemHandler));
server.UDP.RegisterPacketCallback(PacketType.MoveInventoryItem, new PacketCallback(MoveInventoryItemHandler));
server.UDP.RegisterPacketCallback(PacketType.MoveInventoryFolder, new PacketCallback(MoveInventoryFolderHandler));
server.UDP.RegisterPacketCallback(PacketType.PurgeInventoryDescendents, new PacketCallback(PurgeInventoryDescendentsHandler));
}
public void Stop()
@@ -281,7 +282,7 @@ namespace Simian.Extensions
for (int j = 0; j < count; j++)
descendents.FolderData[j] = folderBlocks[splitPoints[i] + j];
Server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory);
server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory);
}
}
else
@@ -297,7 +298,7 @@ namespace Simian.Extensions
descendents.FolderData = new InventoryDescendentsPacket.FolderDataBlock[0];
descendents.ItemData = new InventoryDescendentsPacket.ItemDataBlock[0];
Server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory);
server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory);
}
if (itemBlocks.Length > 0)
@@ -323,7 +324,7 @@ namespace Simian.Extensions
for (int j = 0; j < count; j++)
descendents.ItemData[j] = itemBlocks[splitPoints[i] + j];
Server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory);
server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory);
}
}
}
@@ -403,7 +404,7 @@ namespace Simian.Extensions
for (int j = 0; j < count; j++)
reply.InventoryData[j] = blocks[splitPoints[i] + j];
Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory);
server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory);
}
}
@@ -540,7 +541,7 @@ namespace Simian.Extensions
Logger.DebugLog("Sending bulk update for inventory object " + obj.ID);
Server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Inventory);
server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Inventory);
}
void MoveInventory(Agent agent, Dictionary<UUID, InventoryObject> agentInventory, UUID objectID,
@@ -784,7 +785,7 @@ namespace Simian.Extensions
update.InventoryData[0].Type = (sbyte)item.AssetType;
if (sendPacket)
Server.UDP.SendPacket(agentID, update, PacketCategory.Inventory);
server.UDP.SendPacket(agentID, update, PacketCategory.Inventory);
return item.ID;
}

View File

@@ -6,19 +6,20 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class Messaging : IExtension
public class Messaging : IExtension<Simian>
{
Simian Server;
Simian server;
public Messaging(Simian server)
public Messaging()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
Server.UDP.RegisterPacketCallback(PacketType.ChatFromViewer, new PacketCallback(ChatFromViewerHandler));
Server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler));
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.ChatFromViewer, new PacketCallback(ChatFromViewerHandler));
server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler));
}
public void Stop()
@@ -45,7 +46,7 @@ namespace Simian.Extensions
chat.ChatData.FromName = Utils.StringToBytes(agent.Avatar.Name);
chat.ChatData.Message = viewerChat.ChatData.Message;
Server.UDP.BroadcastPacket(chat, PacketCategory.Transaction);
server.UDP.BroadcastPacket(chat, PacketCategory.Transaction);
}
void ImprovedInstantMessageHandler(Packet packet, Agent agent)
@@ -55,9 +56,9 @@ namespace Simian.Extensions
if (dialog == InstantMessageDialog.MessageFromAgent)
{
lock (Server.Agents)
lock (server.Agents)
{
foreach (Agent recipient in Server.Agents.Values)
foreach (Agent recipient in server.Agents.Values)
{
if (recipient.AgentID == im.MessageBlock.ToAgentID)
{
@@ -77,7 +78,7 @@ namespace Simian.Extensions
sendIM.AgentData.AgentID = agent.AgentID;
Server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction);
server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction);
break;
}

View File

@@ -6,19 +6,21 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
class Money : IExtension
class Money : IExtension<Simian>
{
Simian Server;
Simian server;
public Money(Simian server)
public Money()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
Server.UDP.RegisterPacketCallback(PacketType.MoneyBalanceRequest, new PacketCallback(MoneyBalanceRequestHandler));
Server.UDP.RegisterPacketCallback(PacketType.MoneyTransferRequest, new PacketCallback(MoneyTransferRequestHandler));
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.MoneyBalanceRequest, new PacketCallback(MoneyBalanceRequestHandler));
server.UDP.RegisterPacketCallback(PacketType.MoneyTransferRequest, new PacketCallback(MoneyTransferRequestHandler));
}
public void Stop()
@@ -33,7 +35,7 @@ namespace Simian.Extensions
reply.MoneyData.TransactionID = transactionID;
reply.MoneyData.Description = Utils.StringToBytes(message);
Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction);
server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction);
}
void MoneyBalanceRequestHandler(Packet packet, Agent agent)
@@ -50,9 +52,9 @@ namespace Simian.Extensions
if (request.MoneyData.Amount < 0 || request.MoneyData.Amount > agent.Balance)
return;
lock (Server.Agents)
lock (server.Agents)
{
foreach (Agent recipient in Server.Agents.Values)
foreach (Agent recipient in server.Agents.Values)
{
if (recipient.AgentID == request.MoneyData.DestID)
{

View File

@@ -7,7 +7,7 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class Movement : IExtension
public class Movement : IExtension<Simian>
{
const int UPDATE_ITERATION = 100; //rate in milliseconds to send ObjectUpdate
const bool ENVIRONMENT_SOUNDS = true; //collision sounds, splashing, etc
@@ -23,7 +23,7 @@ namespace Simian.Extensions
const float PREJUMP_DELAY = 0.25f; //seconds before actually jumping
const float AVATAR_TERMINAL_VELOCITY = 54f; //~120mph
UUID BIG_SPLASH_SOUND = new UUID("486475b9-1460-4969-871e-fad973b38015");
static readonly UUID BIG_SPLASH_SOUND = new UUID("486475b9-1460-4969-871e-fad973b38015");
const float SQRT_TWO = 1.41421356f;
@@ -37,13 +37,14 @@ namespace Simian.Extensions
set { Interlocked.Exchange(ref lastTick, value); }
}
public Movement(Simian server)
public Movement()
{
this.server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.AgentUpdate, new PacketCallback(AgentUpdateHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentHeightWidth, new PacketCallback(AgentHeightWidthHandler));
server.UDP.RegisterPacketCallback(PacketType.SetAlwaysRun, new PacketCallback(SetAlwaysRunHandler));

View File

@@ -8,31 +8,32 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class ObjectManager : IExtension
public class ObjectManager : IExtension<Simian>
{
Simian Server;
Simian server;
public ObjectManager(Simian server)
public ObjectManager()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
Server.UDP.RegisterPacketCallback(PacketType.ObjectAdd, new PacketCallback(ObjectAddHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectDuplicate, new PacketCallback(ObjectDuplicateHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectSelect, new PacketCallback(ObjectSelectHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectDeselect, new PacketCallback(ObjectDeselectHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectLink, new PacketCallback(ObjectLinkHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectDelink, new PacketCallback(ObjectDelinkHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectShape, new PacketCallback(ObjectShapeHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectFlagUpdate, new PacketCallback(ObjectFlagUpdateHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectExtraParams, new PacketCallback(ObjectExtraParamsHandler));
Server.UDP.RegisterPacketCallback(PacketType.ObjectImage, new PacketCallback(ObjectImageHandler));
Server.UDP.RegisterPacketCallback(PacketType.DeRezObject, new PacketCallback(DeRezObjectHandler));
Server.UDP.RegisterPacketCallback(PacketType.MultipleObjectUpdate, new PacketCallback(MultipleObjectUpdateHandler));
Server.UDP.RegisterPacketCallback(PacketType.RequestObjectPropertiesFamily, new PacketCallback(RequestObjectPropertiesFamilyHandler));
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.ObjectAdd, new PacketCallback(ObjectAddHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectDuplicate, new PacketCallback(ObjectDuplicateHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectSelect, new PacketCallback(ObjectSelectHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectDeselect, new PacketCallback(ObjectDeselectHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectLink, new PacketCallback(ObjectLinkHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectDelink, new PacketCallback(ObjectDelinkHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectShape, new PacketCallback(ObjectShapeHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectFlagUpdate, new PacketCallback(ObjectFlagUpdateHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectExtraParams, new PacketCallback(ObjectExtraParamsHandler));
server.UDP.RegisterPacketCallback(PacketType.ObjectImage, new PacketCallback(ObjectImageHandler));
server.UDP.RegisterPacketCallback(PacketType.DeRezObject, new PacketCallback(DeRezObjectHandler));
server.UDP.RegisterPacketCallback(PacketType.MultipleObjectUpdate, new PacketCallback(MultipleObjectUpdateHandler));
server.UDP.RegisterPacketCallback(PacketType.RequestObjectPropertiesFamily, new PacketCallback(RequestObjectPropertiesFamilyHandler));
}
public void Stop()
@@ -62,7 +63,7 @@ namespace Simian.Extensions
if (add.ObjectData.RayTargetID != UUID.Zero)
{
SimulationObject obj;
if (Server.Scene.TryGetObject(add.ObjectData.RayTargetID, out obj))
if (server.Scene.TryGetObject(add.ObjectData.RayTargetID, out obj))
{
// Test for a collision with the specified object
position = ObjectCollisionTest(add.ObjectData.RayStart, add.ObjectData.RayEnd, obj);
@@ -159,15 +160,15 @@ namespace Simian.Extensions
prim.Properties.Permissions = Permissions.FullPermissions;
prim.Properties.SalePrice = 10;
prim.RegionHandle = Server.RegionHandle;
prim.RegionHandle = server.RegionHandle;
prim.Rotation = add.ObjectData.Rotation;
prim.Scale = scale;
prim.Textures = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
prim.TextColor = Color4.Black;
// Add this prim to the object database
SimulationObject simObj = new SimulationObject(prim, Server);
Server.Scene.ObjectAdd(this, agent, simObj, flags);
SimulationObject simObj = new SimulationObject(prim, server);
server.Scene.ObjectAdd(this, agent, simObj, flags);
}
void ObjectDuplicateHandler(Packet packet, Agent agent)
@@ -182,13 +183,13 @@ namespace Simian.Extensions
uint dupeID = duplicate.ObjectData[i].ObjectLocalID;
SimulationObject obj;
if (Server.Scene.TryGetObject(dupeID, out obj))
if (server.Scene.TryGetObject(dupeID, out obj))
{
SimulationObject newObj = new SimulationObject(obj);
newObj.Prim.Position += offset;
newObj.Prim.ID = UUID.Random();
Server.Scene.ObjectAdd(this, agent, newObj, flags);
server.Scene.ObjectAdd(this, agent, newObj, flags);
}
else
{
@@ -199,7 +200,7 @@ namespace Simian.Extensions
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = dupeID;
Server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State);
server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State);
}
}
}
@@ -215,7 +216,7 @@ namespace Simian.Extensions
properties.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
SimulationObject obj;
if (Server.Scene.TryGetObject(select.ObjectData[i].ObjectLocalID, out obj))
if (server.Scene.TryGetObject(select.ObjectData[i].ObjectLocalID, out obj))
{
//Logger.DebugLog("Selecting object " + obj.Prim.LocalID);
@@ -239,7 +240,7 @@ namespace Simian.Extensions
properties.ObjectData[0].TextureID = new byte[0];
properties.ObjectData[0].TouchName = new byte[0];
Server.UDP.SendPacket(agent.AgentID, properties, PacketCategory.Transaction);
server.UDP.SendPacket(agent.AgentID, properties, PacketCategory.Transaction);
}
else
{
@@ -256,7 +257,7 @@ namespace Simian.Extensions
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = select.ObjectData[i].ObjectLocalID;
Server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State);
server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State);
}
}
@@ -271,7 +272,7 @@ namespace Simian.Extensions
uint localID = deselect.ObjectData[i].ObjectLocalID;
SimulationObject obj;
if (Server.Scene.TryGetObject(localID, out obj))
if (server.Scene.TryGetObject(localID, out obj))
{
//Logger.DebugLog("Deselecting object " + obj.Prim.LocalID);
}
@@ -287,7 +288,7 @@ namespace Simian.Extensions
for (int i = 0; i < link.ObjectData.Length; i++)
{
SimulationObject obj;
if (!Server.Scene.TryGetObject(link.ObjectData[i].ObjectLocalID, out obj))
if (!server.Scene.TryGetObject(link.ObjectData[i].ObjectLocalID, out obj))
{
//TODO: send an error message
return;
@@ -309,19 +310,19 @@ namespace Simian.Extensions
ObjectUpdatePacket update = new ObjectUpdatePacket();
update.RegionData.RegionHandle = Server.RegionHandle;
update.RegionData.RegionHandle = server.RegionHandle;
update.RegionData.TimeDilation = UInt16.MaxValue;
update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
update.ObjectData[0] = SimulationObject.BuildUpdateBlock(linkSet[i].Prim, Server.RegionHandle,
update.ObjectData[0] = SimulationObject.BuildUpdateBlock(linkSet[i].Prim, server.RegionHandle,
linkSet[i].Prim.PrimData.State, linkSet[i].Prim.Flags);
if (linkSet[i].Prim.ParentID > 0)
{
//previously linked children
SimulationObject parent;
if (Server.Scene.TryGetObject(linkSet[i].Prim.ParentID, out parent))
if (server.Scene.TryGetObject(linkSet[i].Prim.ParentID, out parent))
{
//re-add old root orientation
linkSet[i].Prim.Position = parent.Prim.Position + Vector3.Transform(linkSet[i].Prim.Position, Matrix4.CreateFromQuaternion(parent.Prim.Rotation));
@@ -348,7 +349,7 @@ namespace Simian.Extensions
linkSet[i].Prim.Position, linkSet[i].Prim.Rotation,
Vector3.Zero, Vector3.Zero, Vector3.Zero);
Server.UDP.BroadcastPacket(update, PacketCategory.State);
server.UDP.BroadcastPacket(update, PacketCategory.State);
}
}
@@ -361,7 +362,7 @@ namespace Simian.Extensions
for (int i = 0; i < delink.ObjectData.Length; i++)
{
SimulationObject obj;
if (!Server.Scene.TryGetObject(delink.ObjectData[i].ObjectLocalID, out obj))
if (!server.Scene.TryGetObject(delink.ObjectData[i].ObjectLocalID, out obj))
{
//TODO: send an error message
return;
@@ -379,7 +380,7 @@ namespace Simian.Extensions
ObjectUpdatePacket update = new ObjectUpdatePacket();
update.RegionData.RegionHandle = Server.RegionHandle;
update.RegionData.RegionHandle = server.RegionHandle;
update.RegionData.TimeDilation = UInt16.MaxValue;
update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[linkSet.Count];
@@ -387,7 +388,7 @@ namespace Simian.Extensions
for (int i = 0; i < linkSet.Count; i++)
{
update.ObjectData[i] = SimulationObject.BuildUpdateBlock(linkSet[i].Prim,
Server.RegionHandle, 0, linkSet[i].Prim.Flags);
server.RegionHandle, 0, linkSet[i].Prim.Flags);
update.ObjectData[i].ParentID = 0;
linkSet[i].LinkNumber = 0;
@@ -404,7 +405,7 @@ namespace Simian.Extensions
Vector3.Zero, Vector3.Zero, Vector3.Zero);
}
Server.UDP.BroadcastPacket(update, PacketCategory.State);
server.UDP.BroadcastPacket(update, PacketCategory.State);
}
void ObjectShapeHandler(Packet packet, Agent agent)
@@ -416,7 +417,7 @@ namespace Simian.Extensions
ObjectShapePacket.ObjectDataBlock block = shape.ObjectData[i];
SimulationObject obj;
if (Server.Scene.TryGetObject(block.ObjectLocalID, out obj))
if (server.Scene.TryGetObject(block.ObjectLocalID, out obj))
{
Primitive.ConstructionData data = obj.Prim.PrimData;
@@ -439,7 +440,7 @@ namespace Simian.Extensions
data.ProfileEnd = Primitive.UnpackEndCut(block.ProfileEnd);
data.ProfileHollow = Primitive.UnpackProfileHollow(block.ProfileHollow);
Server.Scene.ObjectModify(this, obj, data);
server.Scene.ObjectModify(this, obj, data);
}
else
{
@@ -454,7 +455,7 @@ namespace Simian.Extensions
ObjectFlagUpdatePacket update = (ObjectFlagUpdatePacket)packet;
SimulationObject obj;
if (Server.Scene.TryGetObject(update.AgentData.ObjectLocalID, out obj))
if (server.Scene.TryGetObject(update.AgentData.ObjectLocalID, out obj))
{
PrimFlags flags = obj.Prim.Flags;
@@ -478,7 +479,7 @@ namespace Simian.Extensions
else
flags &= ~PrimFlags.Physics;
Server.Scene.ObjectFlags(this, obj, flags);
server.Scene.ObjectFlags(this, obj, flags);
}
else
{
@@ -496,7 +497,7 @@ namespace Simian.Extensions
ObjectExtraParamsPacket.ObjectDataBlock block = extra.ObjectData[i];
SimulationObject obj;
if (Server.Scene.TryGetObject(block.ObjectLocalID, out obj))
if (server.Scene.TryGetObject(block.ObjectLocalID, out obj))
{
ExtraParamType type = (ExtraParamType)block.ParamType;
}
@@ -511,8 +512,8 @@ namespace Simian.Extensions
for (int i = 0; i < image.ObjectData.Length; i++)
{
SimulationObject obj;
if (Server.Scene.TryGetObject(image.ObjectData[i].ObjectLocalID, out obj))
Server.Scene.ObjectImage(this, obj,
if (server.Scene.TryGetObject(image.ObjectData[i].ObjectLocalID, out obj))
server.Scene.ObjectImage(this, obj,
Utils.BytesToString(image.ObjectData[i].MediaURL),
new Primitive.TextureEntry(image.ObjectData[i].TextureEntry, 0, image.ObjectData[i].TextureEntry.Length));
}
@@ -530,7 +531,7 @@ namespace Simian.Extensions
uint localID = derez.ObjectData[i].ObjectLocalID;
SimulationObject obj;
if (Server.Scene.TryGetObject(localID, out obj))
if (server.Scene.TryGetObject(localID, out obj))
{
switch (destination)
{
@@ -560,15 +561,15 @@ namespace Simian.Extensions
break;
case DeRezDestination.TrashFolder:
InventoryObject invObj;
if (Server.Inventory.TryGetInventory(agent.AgentID, derez.AgentBlock.DestinationID, out invObj) &&
if (server.Inventory.TryGetInventory(agent.AgentID, derez.AgentBlock.DestinationID, out invObj) &&
invObj is InventoryFolder)
{
// FIXME: Handle children
InventoryFolder trash = (InventoryFolder)invObj;
Server.Inventory.CreateItem(agent.AgentID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object,
server.Inventory.CreateItem(agent.AgentID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object,
AssetType.Object, obj.Prim.ID, trash.ID, PermissionMask.All, PermissionMask.All, agent.AgentID,
obj.Prim.Properties.CreatorID, derez.AgentBlock.TransactionID, 0, true);
Server.Scene.ObjectRemove(this, obj);
server.Scene.ObjectRemove(this, obj);
Logger.DebugLog(String.Format("Derezzed prim {0} to agent inventory trash", obj.Prim.LocalID));
}
@@ -608,7 +609,7 @@ namespace Simian.Extensions
MultipleObjectUpdatePacket.ObjectDataBlock block = update.ObjectData[i];
SimulationObject obj;
if (Server.Scene.TryGetObject(block.ObjectLocalID, out obj))
if (server.Scene.TryGetObject(block.ObjectLocalID, out obj))
{
UpdateType type = (UpdateType)block.Type;
bool linked = ((type & UpdateType.Linked) != 0);
@@ -639,7 +640,7 @@ namespace Simian.Extensions
// Although the object has already been modified, we need
// to inform the scene manager of the changes so they are
// sent to clients and propagated to other extensions
Server.Scene.ObjectTransform(this, obj, position, rotation,
server.Scene.ObjectTransform(this, obj, position, rotation,
obj.Prim.Velocity, obj.Prim.Acceleration, obj.Prim.AngularVelocity,
scale);
}
@@ -651,7 +652,7 @@ namespace Simian.Extensions
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = block.ObjectLocalID;
Server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State);
server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State);
}
}
}
@@ -662,7 +663,7 @@ namespace Simian.Extensions
ReportType type = (ReportType)request.ObjectData.RequestFlags;
SimulationObject obj;
if (Server.Scene.TryGetObject(request.ObjectData.ObjectID, out obj))
if (server.Scene.TryGetObject(request.ObjectData.ObjectID, out obj))
{
ObjectPropertiesFamilyPacket props = new ObjectPropertiesFamilyPacket();
props.ObjectData.BaseMask = (uint)obj.Prim.Properties.Permissions.BaseMask;
@@ -682,7 +683,7 @@ namespace Simian.Extensions
props.ObjectData.SalePrice = obj.Prim.Properties.SalePrice;
props.ObjectData.SaleType = (byte)obj.Prim.Properties.SaleType;
Server.UDP.SendPacket(agent.AgentID, props, PacketCategory.Transaction);
server.UDP.SendPacket(agent.AgentID, props, PacketCategory.Transaction);
}
else
{
@@ -718,7 +719,7 @@ namespace Simian.Extensions
if (obj.Prim.ParentID != 0)
{
SimulationObject parent;
if (Server.Scene.TryGetObject(obj.Prim.ParentID, out parent))
if (server.Scene.TryGetObject(obj.Prim.ParentID, out parent))
mesh = obj.GetWorldMesh(DetailLevel.Low, parent);
}
else

View File

@@ -6,20 +6,21 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class ParcelManager : IExtension, IParcelProvider
public class ParcelManager : IExtension<Simian>, IParcelProvider
{
Simian server;
Dictionary<int, Parcel> parcels = new Dictionary<int, Parcel>();
/// <summary>X,Y ordered 2D array of the parcelIDs for each sq. meter of a simulator</summary>
int[] parcelOverlay = new int[64 * 64];
public ParcelManager(Simian server)
public ParcelManager()
{
this.server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
lock (parcels)
parcels.Clear();

View File

@@ -6,18 +6,19 @@ using OpenMetaverse.Rendering;
namespace Simian.Extensions
{
public class RenderingPluginMesher : IExtension, IMeshingProvider
public class RenderingPluginMesher : IExtension<Simian>, IMeshingProvider
{
Simian Server;
Simian server;
IRendering Renderer;
public RenderingPluginMesher(Simian server)
public RenderingPluginMesher()
{
Server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
// Search for a the best available OpenMetaverse.Rendering plugin
List<string> renderers = RenderingLoader.ListRenderers(AppDomain.CurrentDomain.BaseDirectory);

View File

@@ -12,7 +12,7 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class SceneManager : IExtension, ISceneProvider
public class SceneManager : IExtension<Simian>, ISceneProvider
{
Simian server;
DoubleDictionary<uint, UUID, SimulationObject> sceneObjects = new DoubleDictionary<uint, UUID, SimulationObject>();
@@ -41,13 +41,14 @@ namespace Simian.Extensions
public float WaterHeight { get { return 35f; } }
public SceneManager(Simian server)
public SceneManager()
{
this.server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
server.UDP.RegisterPacketCallback(PacketType.CompleteAgentMovement, new PacketCallback(CompleteAgentMovementHandler));
LoadTerrain(server.DataDir + "heightmap.tga");
}

View File

@@ -68,21 +68,20 @@ namespace Simian
}
}
public class UDPManager : IExtension, IUDPProvider
public class UDPManager : IExtension<Simian>, IUDPProvider
{
Simian Server;
Simian server;
UDPServer udpServer;
public UDPManager(Simian server)
public UDPManager()
{
Server = server;
// Have to do this in the constructor, because we don't know that the
// UDP extension will be started before other extensions
udpServer = new UDPServer(Server.UDPPort, Server);
}
public void Start()
public void Start(Simian server)
{
this.server = server;
udpServer = new UDPServer(server.UDPPort, server);
}
public void Stop()

View File

@@ -8,17 +8,18 @@ using OpenMetaverse.StructuredData;
namespace Simian.Extensions
{
public class XMLPersistence : IExtension, IPersistenceProvider
public class XMLPersistence : IExtension<Simian>, IPersistenceProvider
{
Simian server;
public XMLPersistence(Simian server)
public XMLPersistence()
{
this.server = server;
}
public void Start()
public void Start(Simian server)
{
this.server = server;
LLSD llsd;
try