diff --git a/Programs/SimExport/SimExport.cs b/Programs/SimExport/SimExport.cs index b20fb979..e06d191c 100644 --- a/Programs/SimExport/SimExport.cs +++ b/Programs/SimExport/SimExport.cs @@ -270,7 +270,7 @@ namespace SimExport client.Self.Movement.SendManualUpdate( flags, pos, Vector3.UnitZ, Vector3.UnitX, Vector3.UnitY, Quaternion.Identity, Quaternion.Identity, far, - AgentManager.AgentFlags.None, AgentManager.AgentState.None, false); + AgentFlags.None, AgentState.None, false); } Thread.Sleep(500); diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index 360cfb5c..601fe106 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -33,7 +33,6 @@ namespace Simian.Extensions server.UDP.RegisterPacketCallback(PacketType.SoundTrigger, SoundTriggerHandler); server.UDP.RegisterPacketCallback(PacketType.ViewerEffect, ViewerEffectHandler); server.UDP.RegisterPacketCallback(PacketType.UUIDNameRequest, UUIDNameRequestHandler); - server.UDP.RegisterPacketCallback(PacketType.TeleportRequest, TeleportRequestHandler); if (CoarseLocationTimer != null) CoarseLocationTimer.Dispose(); CoarseLocationTimer = new Timer(CoarseLocationTimer_Elapsed); @@ -422,22 +421,6 @@ namespace Simian.Extensions server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); } - void TeleportRequestHandler(Packet packet, Agent agent) - { - TeleportRequestPacket request = (TeleportRequestPacket)packet; - - if (request.Info.RegionID == server.Scene.RegionID) - { - // Local teleport - agent.Avatar.Position = request.Info.Position; - agent.CurrentLookAt = request.Info.LookAt; - } - else - { - Logger.Log("Ignoring teleport request to " + request.Info.RegionID, Helpers.LogLevel.Warning); - } - } - void CoarseLocationTimer_Elapsed(object sender) { // Create lists containing all of the agent blocks diff --git a/Programs/Simian/Extensions/ConnectionManagement.cs b/Programs/Simian/Extensions/ConnectionManagement.cs index 7f9526e6..055962da 100644 --- a/Programs/Simian/Extensions/ConnectionManagement.cs +++ b/Programs/Simian/Extensions/ConnectionManagement.cs @@ -32,12 +32,10 @@ namespace Simian.Extensions handshake.RegionInfo.BillableFactor = 0f; handshake.RegionInfo.CacheID = UUID.Random(); handshake.RegionInfo.IsEstateManager = false; - handshake.RegionInfo.RegionFlags = (uint)(RegionFlags.AllowDirectTeleport | RegionFlags.AllowLandmark | - RegionFlags.AllowParcelChanges | RegionFlags.AllowSetHome | RegionFlags.AllowVoice | RegionFlags.PublicAllowed | - RegionFlags.Sandbox | RegionFlags.TaxFree); + handshake.RegionInfo.RegionFlags = (uint)server.Scene.RegionFlags; handshake.RegionInfo.SimOwner = UUID.Random(); handshake.RegionInfo.SimAccess = (byte)SimAccess.Min; - handshake.RegionInfo.SimName = Utils.StringToBytes("Simian"); + handshake.RegionInfo.SimName = Utils.StringToBytes(server.Scene.RegionName); handshake.RegionInfo.WaterHeight = server.Scene.WaterHeight; handshake.RegionInfo.TerrainBase0 = UUID.Zero; handshake.RegionInfo.TerrainBase1 = UUID.Zero; diff --git a/Programs/Simian/Extensions/MapLocal.cs b/Programs/Simian/Extensions/MapLocal.cs new file mode 100644 index 00000000..1664b4e6 --- /dev/null +++ b/Programs/Simian/Extensions/MapLocal.cs @@ -0,0 +1,135 @@ +using System; +using ExtensionLoader; +using OpenMetaverse; +using OpenMetaverse.Packets; + +namespace Simian.Extensions +{ + public class MapLocal : IExtension + { + Simian server; + + public MapLocal() + { + } + + public void Start(Simian server) + { + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.MapLayerRequest, MapLayerRequestHandler); + server.UDP.RegisterPacketCallback(PacketType.MapBlockRequest, MapBlockRequestHandler); + server.UDP.RegisterPacketCallback(PacketType.TeleportRequest, TeleportRequestHandler); + server.UDP.RegisterPacketCallback(PacketType.TeleportLocationRequest, TeleportLocationRequestHandler); + } + + public void Stop() + { + } + + void MapLayerRequestHandler(Packet packet, Agent agent) + { + MapLayerRequestPacket request = (MapLayerRequestPacket)packet; + GridLayerType type = (GridLayerType)request.AgentData.Flags; + + MapLayerReplyPacket reply = new MapLayerReplyPacket(); + reply.AgentData.AgentID = agent.Avatar.ID; + reply.AgentData.Flags = (uint)type; + reply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1]; + reply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock(); + reply.LayerData[0].Bottom = 0; + reply.LayerData[0].Left = 0; + reply.LayerData[0].Top = UInt16.MaxValue; + reply.LayerData[0].Right = UInt16.MaxValue; + reply.LayerData[0].ImageID = new UUID("89556747-24cb-43ed-920b-47caed15465f"); + + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + } + + void MapBlockRequestHandler(Packet packet, Agent agent) + { + MapBlockRequestPacket request = (MapBlockRequestPacket)packet; + GridLayerType type = (GridLayerType)request.AgentData.Flags; + + MapBlockReplyPacket reply = new MapBlockReplyPacket(); + reply.AgentData.AgentID = agent.Avatar.ID; + reply.AgentData.Flags = (uint)type; + + reply.Data = new MapBlockReplyPacket.DataBlock[2]; + + reply.Data[0] = new MapBlockReplyPacket.DataBlock(); + reply.Data[0].Access = (byte)SimAccess.Min; + reply.Data[0].Agents = (byte)server.Scene.AgentCount(); + reply.Data[0].MapImageID = new UUID("89556747-24cb-43ed-920b-47caed15465f"); + reply.Data[0].Name = Utils.StringToBytes(server.Scene.RegionName); + reply.Data[0].RegionFlags = (uint)server.Scene.RegionFlags; + reply.Data[0].WaterHeight = (byte)server.Scene.WaterHeight; + reply.Data[0].X = (ushort)server.Scene.RegionX; + reply.Data[0].Y = (ushort)server.Scene.RegionY; + + reply.Data[1] = new MapBlockReplyPacket.DataBlock(); + reply.Data[1].Access = (byte)SimAccess.Min; + reply.Data[1].Agents = 0; + reply.Data[1].MapImageID = new UUID("89556747-24cb-43ed-920b-47caed15465f"); + reply.Data[1].Name = Utils.StringToBytes("HyperGrid Portal to OSGrid"); + reply.Data[1].RegionFlags = (uint)server.Scene.RegionFlags; + reply.Data[1].WaterHeight = (byte)server.Scene.WaterHeight; + reply.Data[1].X = (ushort)(server.Scene.RegionX + 1); + reply.Data[1].Y = (ushort)server.Scene.RegionY; + + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + } + + void TeleportRequestHandler(Packet packet, Agent agent) + { + TeleportRequestPacket request = (TeleportRequestPacket)packet; + + if (request.Info.RegionID == server.Scene.RegionID) + { + // Local teleport + agent.Avatar.Position = request.Info.Position; + agent.CurrentLookAt = request.Info.LookAt; + + TeleportLocalPacket reply = new TeleportLocalPacket(); + reply.Info.AgentID = agent.Avatar.ID; + reply.Info.LocationID = 0; // Unused by the client + reply.Info.LookAt = agent.CurrentLookAt; + reply.Info.Position = agent.Avatar.Position; + // TODO: Need a "Flying" boolean for Agent + reply.Info.TeleportFlags = (uint)TeleportFlags.ViaRegionID; + + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + } + else + { + Logger.Log("Ignoring teleport request to " + request.Info.RegionID, Helpers.LogLevel.Warning); + } + } + + void TeleportLocationRequestHandler(Packet packet, Agent agent) + { + TeleportLocationRequestPacket request = (TeleportLocationRequestPacket)packet; + + if (request.Info.RegionHandle == server.Scene.RegionHandle) + { + // Local teleport + agent.Avatar.Position = request.Info.Position; + agent.CurrentLookAt = request.Info.LookAt; + + TeleportLocalPacket reply = new TeleportLocalPacket(); + reply.Info.AgentID = agent.Avatar.ID; + reply.Info.LocationID = 0; // Unused by the client + reply.Info.LookAt = agent.CurrentLookAt; + reply.Info.Position = agent.Avatar.Position; + // TODO: Need a "Flying" boolean for Agent + reply.Info.TeleportFlags = (uint)TeleportFlags.ViaLocation; + + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + } + else + { + Logger.Log("Ignoring teleport request to " + request.Info.RegionHandle, Helpers.LogLevel.Warning); + } + } + } +} diff --git a/Programs/Simian/Extensions/Periscope.cs b/Programs/Simian/Extensions/Periscope.cs index 9b2689d9..5aef028b 100644 --- a/Programs/Simian/Extensions/Periscope.cs +++ b/Programs/Simian/Extensions/Periscope.cs @@ -175,9 +175,9 @@ namespace Simian.Extensions server.UDP.BroadcastPacket(chat, PacketCategory.Transaction); } - void Self_OnTeleport(string message, AgentManager.TeleportStatus status, AgentManager.TeleportFlags flags) + void Self_OnTeleport(string message, TeleportStatus status, TeleportFlags flags) { - if (status == AgentManager.TeleportStatus.Finished) + if (status == TeleportStatus.Finished) { server.Scene.ForEachObject( delegate(SimulationObject obj) diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index a2b61e56..0019ecec 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -39,6 +39,8 @@ namespace Simian.Extensions public uint RegionY { get { return 1000; } } public ulong RegionHandle { get { return regionHandle; } } public UUID RegionID { get { return regionID; } } + public string RegionName { get { return "Simian"; } } + public RegionFlags RegionFlags { get { return RegionFlags.None; } } public float WaterHeight { get { return 20f; } } @@ -309,6 +311,11 @@ namespace Simian.Extensions return sceneObjects.ContainsKey(id) || sceneAgents.ContainsKey(id); } + public int ObjectCount() + { + return sceneObjects.Count; + } + public bool TryGetObject(uint localID, out SimulationObject obj) { return sceneObjects.TryGetValue(localID, out obj); @@ -403,6 +410,11 @@ namespace Simian.Extensions return sceneAgents.TryGetValue(id, out agent); } + public int AgentCount() + { + return sceneAgents.Count; + } + public void ForEachAgent(Action action) { sceneAgents.ForEach(action); diff --git a/Programs/Simian/Interfaces/ISceneProvider.cs b/Programs/Simian/Interfaces/ISceneProvider.cs index 6e6af591..a44891d7 100644 --- a/Programs/Simian/Interfaces/ISceneProvider.cs +++ b/Programs/Simian/Interfaces/ISceneProvider.cs @@ -44,6 +44,8 @@ namespace Simian uint RegionY { get; } ulong RegionHandle { get; } UUID RegionID { get; } + string RegionName { get; } + RegionFlags RegionFlags { get; } float WaterHeight { get; } @@ -63,12 +65,14 @@ namespace Simian void ObjectModify(object sender, uint localID, Primitive.ConstructionData data); bool ContainsObject(uint localID); bool ContainsObject(UUID id); + int ObjectCount(); bool TryGetObject(uint localID, out SimulationObject obj); bool TryGetObject(UUID id, out SimulationObject obj); void ForEachObject(Action obj); bool AgentAdd(object sender, Agent agent, PrimFlags creatorFlags); void AgentAppearance(object sender, Agent agent, Primitive.TextureEntry textures, byte[] visualParams); + int AgentCount(); bool TryGetAgent(uint localID, out Agent agent); bool TryGetAgent(UUID id, out Agent agent); void ForEachAgent(Action action); diff --git a/bin/Simian.ini b/bin/Simian.ini index 0c156556..91afc55c 100644 --- a/bin/Simian.ini +++ b/bin/Simian.ini @@ -73,6 +73,8 @@ RenderingPluginMesher ; Main scene graph engine. All spatial events are processed through here. SceneManager +MapLocal + ; Periscope allows you to proxy a foreign grid simulator into the local Simian ; using a libOpenMetaverse bot. The first person to login to Simian will become ; the master agent, who's movement is tethered to the bot's movement. Any other