Grid Manager code, since apparently I forgot to attach it last time.
-Adam
using System;
using System.Collections;
namespace libsecondlife
{
/// <summary>
/// Class for regions on the world map/
/// </summary>
public class GridRegion
{
public int X;
public int Y;
public string Name;
public byte Access;
public uint RegionFlags;
public byte WaterHeight;
public byte Agents;
public LLUUID MapImageID;
public U64 RegionHandle; // Used for teleporting.
public GridRegion()
{
}
}
/// <summary>
/// Manages grid-wide tasks such as the world map
/// </summary>
public class GridManager
{
public Hashtable Regions;
SecondLife Client;
public GridManager(SecondLife client)
{
Client = client;
Regions = new Hashtable();
PacketCallback callback = new
PacketCallback(MapBlockReplyHandler);
Client.Network.RegisterCallback("MapBlockReply",
callback);
}
public void AddSim(string name)
{
if(!Regions.ContainsKey(name))
{
Client.Network.SendPacket(Packets.Sim.MapNameRequest(Client.Protocol,Client.Avatar.ID,0,0,false,name));
//
Client.Network.SendPacket(Packets.Sim.MapNameRequest(Client.Protocol,Client.Avatar.ID,2,0,false,name));
//
Client.Network.SendPacket(Packets.Sim.MapNameRequest(Client.Protocol,Client.Avatar.ID,512,0,false,name));
}
}
public void AddAllSims()
{
// uint flags = 2;
//
Client.Network.SendPacket(Packets.Sim.MapBlockRequest(Client.Protocol,Client.Avatar.ID,flags,0,false,0,65535,0,65535));
uint flags = 0;
Client.Network.SendPacket(Packets.Sim.MapBlockRequest(Client.Protocol,Client.Avatar.ID,flags,0,false,0,65535,0,65535));
}
public GridRegion GetSim(string name)
{
if(Regions.ContainsKey(name))
return (GridRegion)Regions[name];
AddSim(name);
System.Threading.Thread.Sleep(1000);
if(Regions.ContainsKey(name))
return (GridRegion)Regions[name];
else
{
/* TODO: Put some better handling inplace here
with some retry code */
Helpers.Log("Error returned sim that didnt
exist",Helpers.LogLevel.Warning);
return new GridRegion();
}
}
private void MapBlockReplyHandler(Packet packet, Simulator
simulator)
{
GridRegion region;
foreach (Block block in packet.Blocks())
{
if(block.Layout.Name == "Data")
{
region = new GridRegion();
foreach (Field field in block.Fields)
{
if (field.Layout.Name == "X")
{
if(System.BitConverter.IsLittleEndian)
{
ushort temp =
(ushort)field.Data;
region.X =
((temp << 8) & 0xFF00) | ((temp >> 8) & 0x00FF);
}
else
{
region.X =
(ushort)field.Data;
}
}
else if(field.Layout.Name ==
"Y")
{
if(System.BitConverter.IsLittleEndian)
{
ushort temp =
(ushort)field.Data;
region.Y =
((temp << 8) & 0xFF00) | ((temp >> 8) & 0x00FF);
}
else
{
region.Y =
(ushort)field.Data;
}
}
else if(field.Layout.Name ==
"Name")
region.Name =
Helpers.FieldToString(field.Data);
else if(field.Layout.Name ==
"RegionFlags")
region.RegionFlags =
(uint)field.Data;
else if(field.Layout.Name ==
"WaterHeight")
region.WaterHeight =
(byte)field.Data;
else if(field.Layout.Name ==
"Agents")
region.Agents =
(byte)field.Data;
else if(field.Layout.Name ==
"MapImageID")
region.MapImageID =
(LLUUID)field.Data;
}
region.RegionHandle = new U64(region.X
* 256,region.Y * 256);
if(region.Name != "" && (region.X != 0
&& region.Y != 0))
Regions[region.Name] = region;
}
}
}
}
}
_______________________________________________ libsecondlife-dev mailing list [email protected] https://mail.gna.org/listinfo/libsecondlife-dev
