* Removed unused AgentManager.AgentMovementCallback

* Added Avatar.ControlFlags (not used by libomv directly)
Simian:
* Added ISceneProvider interface
* Fixed ObjectSelect crash (due to a packet block not being filled out if the selected object was missing)
* Simplified BuildFullUpdate()

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2196 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2008-09-04 21:09:44 +00:00
parent bc593002ac
commit f656d185a3
9 changed files with 165 additions and 98 deletions

View File

@@ -11,10 +11,15 @@ using OpenMetaverse.Packets;
namespace Simian.Extensions
{
public class SceneManager : ISimianExtension
public class SceneManager : ISimianExtension, ISceneProvider
{
Simian server;
int currentLocalID = 0;
DoubleDictionary<uint, UUID, SimulationObject> sceneObjects = new DoubleDictionary<uint, UUID, SimulationObject>();
int currentLocalID = 1;
public event ObjectAddedCallback OnObjectAdded;
public event ObjectRemovedCallback OnObjectRemoved;
public event ObjectUpdatedCallback OnObjectUpdated;
public SceneManager(Simian server)
{
@@ -31,6 +36,63 @@ namespace Simian.Extensions
{
}
public void AddObject(Agent creator, SimulationObject obj)
{
// Assign a unique LocalID to this object
obj.Prim.LocalID = (uint)Interlocked.Increment(ref currentLocalID);
// Add the object to the scene dictionary
sceneObjects.Add(obj.Prim.LocalID, obj.Prim.ID, obj);
// Send an update out to the creator
ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0,
obj.Prim.Flags | PrimFlags.CreateSelected | PrimFlags.ObjectYouOwner);
server.UDP.SendPacket(creator.AgentID, updateToOwner, PacketCategory.State);
// Send an update out to everyone else
ObjectUpdatePacket updateToOthers = SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0,
obj.Prim.Flags);
lock (server.Agents)
{
foreach (Agent recipient in server.Agents.Values)
{
if (recipient != creator)
server.UDP.SendPacket(recipient.AgentID, updateToOthers, PacketCategory.State);
}
}
}
public void RemoveObject(SimulationObject obj)
{
sceneObjects.Remove(obj.Prim.LocalID, obj.Prim.ID);
KillObjectPacket kill = new KillObjectPacket();
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = obj.Prim.LocalID;
server.UDP.BroadcastPacket(kill, PacketCategory.State);
}
public bool TryGetObject(uint localID, out SimulationObject obj)
{
return sceneObjects.TryGetValue(localID, out obj);
}
public bool TryGetObject(UUID id, out SimulationObject obj)
{
return sceneObjects.TryGetValue(id, out obj);
}
public void ObjectUpdate(SimulationObject obj, byte state, PrimFlags flags)
{
// Something changed, build an update
ObjectUpdatePacket update =
SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, state, flags);
server.UDP.BroadcastPacket(update, PacketCategory.State);
}
void CompleteAgentMovementHandler(Packet packet, Agent agent)
{
CompleteAgentMovementPacket request = (CompleteAgentMovementPacket)packet;
@@ -74,13 +136,26 @@ namespace Simian.Extensions
server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Transaction);
// Send updates and appearances for every avatar to this new avatar
SynchronizeStateTo(agent);
//HACK: Notify everyone when someone logs on to the simulator
OnlineNotificationPacket online = new OnlineNotificationPacket();
online.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[1];
online.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock();
online.AgentBlock[0].AgentID = agent.AgentID;
server.UDP.BroadcastPacket(online, PacketCategory.State);
}
// HACK: The reduction provider will deprecate this at some point
void SynchronizeStateTo(Agent agent)
{
lock (server.Agents)
{
foreach (Agent otherAgent in server.Agents.Values)
{
// Send ObjectUpdate packets for this avatar
ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(otherAgent.Avatar,
NameValue.NameValuesToString(otherAgent.Avatar.NameValues),
server.RegionHandle, otherAgent.State, otherAgent.Flags);
server.UDP.SendPacket(agent.AgentID, update, PacketCategory.State);
@@ -90,15 +165,15 @@ namespace Simian.Extensions
}
}
sceneObjects.ForEach(delegate(SimulationObject obj)
{
ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(obj.Prim,
obj.Prim.RegionHandle, 0, obj.Prim.Flags);
server.UDP.SendPacket(agent.AgentID, update, PacketCategory.State);
});
// Send terrain data
SendLayerData(agent);
//HACK: Notify everyone when someone logs on to the simulator
OnlineNotificationPacket online = new OnlineNotificationPacket();
online.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[1];
online.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock();
online.AgentBlock[0].AgentID = agent.AgentID;
server.UDP.BroadcastPacket(online, PacketCategory.State);
}
void LoadTerrain(string mapFile)