Files
libremetaverse/Programs/Simian/Extensions/MapLocal.cs
John Hurliman 875aa0b6e8 * Some changes that should have gone in the previous commit
[Simian]
* Adding MapLocal extension to Simian, adds very basic world map, local teleporting, and a stub for HyperGrid teleports
* A few more small additions to ISceneProvider

git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2426 52acb1d6-8a22-11de-b505-999d5b087335
2009-02-03 18:49:00 +00:00

136 lines
5.8 KiB
C#

using System;
using ExtensionLoader;
using OpenMetaverse;
using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class MapLocal : IExtension<Simian>
{
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);
}
}
}
}