diff --git a/Programs/Simian/Extensions/AvatarPropertiesReply.cs b/Programs/Simian/Extensions/AvatarPropertiesReply.cs
new file mode 100644
index 00000000..1c2a1347
--- /dev/null
+++ b/Programs/Simian/Extensions/AvatarPropertiesReply.cs
@@ -0,0 +1,61 @@
+using OpenMetaverse;
+using OpenMetaverse.Packets;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Simian.Extensions
+{
+ class AvatarPropertiesReply : ISimianExtension
+ {
+ Simian Server;
+
+ public AvatarPropertiesReply(Simian server)
+ {
+ Server = server;
+ }
+
+ public void Start()
+ {
+ Server.UDPServer.RegisterPacketCallback(PacketType.AvatarPropertiesRequest, new UDPServer.PacketCallback(AvatarPropertiesRequestHandler));
+ }
+
+ public void Stop()
+ {
+ }
+
+ void AvatarPropertiesRequestHandler(Packet packet, Agent agent)
+ {
+ AvatarPropertiesRequestPacket request = (AvatarPropertiesRequestPacket)packet;
+
+ lock (Server.Agents)
+ {
+ foreach (Agent agt in Server.Agents.Values)
+ {
+ if (agent.AgentID == request.AgentData.AvatarID)
+ {
+ AvatarPropertiesReplyPacket reply = new AvatarPropertiesReplyPacket();
+ reply.AgentData.AgentID = agt.AgentID;
+ reply.AgentData.AvatarID = request.AgentData.AvatarID;
+ reply.PropertiesData.AboutText = Utils.StringToBytes("Profile info unavailable");
+ reply.PropertiesData.BornOn = Utils.StringToBytes("Unknown");
+ reply.PropertiesData.CharterMember = Utils.StringToBytes("Test User");
+ reply.PropertiesData.FLAboutText = Utils.StringToBytes("First life info unavailable");
+ reply.PropertiesData.Flags = 0;
+ //TODO: at least generate static image uuids based on name.
+ //this will prevent re-caching the default image for the same av name.
+ reply.PropertiesData.FLImageID = agent.AgentID; //temporary hack
+ reply.PropertiesData.ImageID = agent.AgentID; //temporary hack
+ reply.PropertiesData.PartnerID = UUID.Zero;
+ reply.PropertiesData.ProfileURL = Utils.StringToBytes(String.Empty);
+
+ agent.SendPacket(reply);
+
+ break;
+ }
+ }
+ }
+ }
+
+ }
+}
diff --git a/Programs/Simian/Extensions/ImageDelivery.cs b/Programs/Simian/Extensions/ImageDelivery.cs
new file mode 100644
index 00000000..5f056928
--- /dev/null
+++ b/Programs/Simian/Extensions/ImageDelivery.cs
@@ -0,0 +1,59 @@
+using OpenMetaverse;
+using OpenMetaverse.Imaging;
+using OpenMetaverse.Packets;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+
+namespace Simian.Extensions
+{
+ public class ImageDelivery : ISimianExtension
+ {
+ Simian Server;
+ Bitmap DefaultImage;
+
+ public ImageDelivery(Simian server)
+ {
+ Server = server;
+ }
+
+ public void Start()
+ {
+ Server.UDPServer.RegisterPacketCallback(PacketType.RequestImage, new UDPServer.PacketCallback(RequestImageHandler));
+
+ if (DefaultImage != null) DefaultImage = null;
+ DefaultImage = new Bitmap(32, 32);
+ Graphics gfx = Graphics.FromImage(DefaultImage);
+ gfx.Clear(Color.White);
+ gfx.FillRectangles(Brushes.LightGray, new Rectangle[] { new Rectangle(16, 16, 16, 16), new Rectangle(0, 0, 16, 16) });
+ gfx.DrawImage(DefaultImage, 0, 0, 32, 32);
+ }
+
+ public void Stop()
+ {
+ }
+
+ void RequestImageHandler(Packet packet, Agent agent)
+ {
+ RequestImagePacket request = (RequestImagePacket)packet;
+
+ foreach (RequestImagePacket.RequestImageBlock block in request.RequestImage)
+ {
+ //ImageNotInDatabasePacket missing = new ImageNotInDatabasePacket();
+ //missing.ImageID.ID = block.Image;
+ //agent.SendPacket(missing);
+
+ ImageDataPacket imageData = new ImageDataPacket();
+ imageData.ImageData.Data = OpenJPEG.EncodeFromImage(DefaultImage, true);
+ imageData.ImageID.ID = block.Image;
+ imageData.ImageID.Codec = 1;
+ imageData.ImageID.Packets = 1;
+ imageData.ImageID.Size = (uint)imageData.ImageData.Data.Length;
+
+ agent.SendPacket(imageData);
+ }
+ }
+
+ }
+}
diff --git a/prebuild.xml b/prebuild.xml
index cf7388a0..086e37f5 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -679,6 +679,7 @@
../../bin/
+