* Removed Agent.CurrentPosition in favor of Agent.Avatar.Position

* Stubbed out the UDP teleport request handler
* Removed some redundancies in the ISceneProvider interface between objects and agents, and fixed SceneManager to operate on both agent and object stores where needed

git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2424 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2009-02-03 01:59:46 +00:00
parent 81048b1010
commit 1ab82e4f17
10 changed files with 110 additions and 96 deletions

View File

@@ -35,12 +35,12 @@ namespace Simian.Extensions
agent.Balance = 1000;
agent.CreationTime = Utils.DateTimeToUnixTime(DateTime.Now);
agent.CurrentLookAt = Vector3.UnitZ;
agent.CurrentPosition = new Vector3(128f, 128f, 25f);
agent.Avatar.Position = new Vector3(128f, 128f, 25f);
agent.CurrentRegionHandle = Utils.UIntsToLong(256 * server.Scene.RegionX, 256 * server.Scene.RegionY);
agent.FirstName = firstName;
agent.GodLevel = 0;
agent.HomeLookAt = agent.CurrentLookAt;
agent.HomePosition = agent.CurrentPosition;
agent.HomePosition = agent.Avatar.Position;
agent.HomeRegionHandle = agent.CurrentRegionHandle;
agent.LastName = lastName;
agent.PasswordHash = password;

View File

@@ -28,10 +28,12 @@ namespace Simian.Extensions
server.UDP.RegisterPacketCallback(PacketType.AgentIsNowWearing, AgentIsNowWearingHandler);
server.UDP.RegisterPacketCallback(PacketType.AgentSetAppearance, AgentSetAppearanceHandler);
server.UDP.RegisterPacketCallback(PacketType.AgentCachedTexture, AgentCachedTextureHandler);
server.UDP.RegisterPacketCallback(PacketType.AgentHeightWidth, AgentHeightWidthHandler);
server.UDP.RegisterPacketCallback(PacketType.AgentAnimation, AgentAnimationHandler);
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);
@@ -375,6 +377,15 @@ namespace Simian.Extensions
server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.Transaction);
}
void AgentHeightWidthHandler(Packet packet, Agent agent)
{
AgentHeightWidthPacket heightWidth = (AgentHeightWidthPacket)packet;
// TODO: These are the screen size dimensions. Useful when we start doing frustum culling
//Logger.Log(String.Format("Agent wants to set height={0}, width={1}",
// heightWidth.HeightWidthBlock.Height, heightWidth.HeightWidthBlock.Width), Helpers.LogLevel.Info);
}
void SoundTriggerHandler(Packet packet, Agent agent)
{
SoundTriggerPacket trigger = (SoundTriggerPacket)packet;
@@ -411,6 +422,22 @@ 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

View File

@@ -56,8 +56,8 @@ namespace Simian.Extensions
if (dialog == InstantMessageDialog.FriendshipAccepted)
{
bool receiverOnline = server.Scene.ContainsAgent(agent.Avatar.ID);
bool senderOnline = server.Scene.ContainsAgent(recipient.Avatar.ID);
bool receiverOnline = server.Scene.ContainsObject(agent.Avatar.ID);
bool senderOnline = server.Scene.ContainsObject(recipient.Avatar.ID);
if (receiverOnline)
{

View File

@@ -48,9 +48,8 @@ namespace Simian.Extensions
server.Scene.OnTerrainUpdate += Scene_OnTerrainUpdate;
server.UDP.RegisterPacketCallback(PacketType.AgentUpdate, new PacketCallback(AgentUpdateHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentHeightWidth, new PacketCallback(AgentHeightWidthHandler));
server.UDP.RegisterPacketCallback(PacketType.SetAlwaysRun, new PacketCallback(SetAlwaysRunHandler));
server.UDP.RegisterPacketCallback(PacketType.AgentUpdate, AgentUpdateHandler);
server.UDP.RegisterPacketCallback(PacketType.SetAlwaysRun, SetAlwaysRunHandler);
updateTimer = new Timer(new TimerCallback(UpdateTimer_Elapsed));
LastTick = Environment.TickCount;
@@ -437,14 +436,5 @@ namespace Simian.Extensions
return 0f;
}
}
void AgentHeightWidthHandler(Packet packet, Agent agent)
{
AgentHeightWidthPacket heightWidth = (AgentHeightWidthPacket)packet;
// TODO: These are the screen size dimensions. Useful when we start doing frustum culling
//Logger.Log(String.Format("Agent wants to set height={0}, width={1}",
// heightWidth.HeightWidthBlock.Height, heightWidth.HeightWidthBlock.Width), Helpers.LogLevel.Info);
}
}
}

View File

@@ -149,6 +149,7 @@ namespace Simian.Extensions
prim.PrimData.ProfileHollow = Primitive.UnpackProfileHollow(add.ObjectData.ProfileHollow);
prim.PrimData.PCode = pcode;
prim.Properties = new Primitive.ObjectProperties();
prim.Properties.CreationDate = DateTime.Now;
prim.Properties.CreatorID = agent.Avatar.ID;
prim.Properties.Description = String.Empty;

View File

@@ -195,7 +195,7 @@ namespace Simian.Extensions
if (agent.Avatar.RegionHandle != localRegionHandle &&
agent.Avatar.RegionHandle != client.Network.CurrentSim.Handle)
{
server.Scene.AgentRemove(this, agent.Avatar.ID);
server.Scene.ObjectRemove(this, agent.Avatar.ID);
}
}
);

View File

@@ -142,7 +142,26 @@ namespace Simian.Extensions
}
else
{
return false;
Agent agent;
if (sceneAgents.TryGetValue(localID, out agent))
{
if (OnAgentRemove != null)
OnAgentRemove(sender, agent);
sceneAgents.Remove(agent.Avatar.LocalID, agent.Avatar.ID);
KillObjectPacket kill = new KillObjectPacket();
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = agent.Avatar.LocalID;
server.UDP.BroadcastPacket(kill, PacketCategory.State);
return true;
}
else
{
return false;
}
}
}
@@ -166,7 +185,26 @@ namespace Simian.Extensions
}
else
{
return false;
Agent agent;
if (sceneAgents.TryGetValue(id, out agent))
{
if (OnAgentRemove != null)
OnAgentRemove(sender, agent);
sceneAgents.Remove(agent.Avatar.LocalID, agent.Avatar.ID);
KillObjectPacket kill = new KillObjectPacket();
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = agent.Avatar.LocalID;
server.UDP.BroadcastPacket(kill, PacketCategory.State);
return true;
}
else
{
return false;
}
}
}
@@ -174,6 +212,8 @@ namespace Simian.Extensions
Vector3 velocity, Vector3 acceleration, Vector3 angularVelocity)
{
SimulationObject obj;
Agent agent;
if (sceneObjects.TryGetValue(localID, out obj))
{
if (OnObjectTransform != null)
@@ -190,7 +230,25 @@ namespace Simian.Extensions
obj.Prim.AngularVelocity = angularVelocity;
// Inform clients
BroadcastObjectUpdate(obj);
BroadcastObjectUpdate(obj.Prim);
}
else if (sceneAgents.TryGetValue(localID, out agent))
{
if (OnObjectTransform != null)
{
OnObjectTransform(sender, obj, position, rotation, velocity,
acceleration, angularVelocity);
}
// Update the avatar
agent.Avatar.Position = position;
agent.Avatar.Rotation = rotation;
agent.Avatar.Velocity = velocity;
agent.Avatar.Acceleration = acceleration;
agent.Avatar.AngularVelocity = angularVelocity;
// Inform clients
BroadcastObjectUpdate(agent.Avatar);
}
}
@@ -205,7 +263,7 @@ namespace Simian.Extensions
obj.Prim.Flags = flags;
// Inform clients
BroadcastObjectUpdate(obj);
BroadcastObjectUpdate(obj.Prim);
}
public void ObjectImage(object sender, SimulationObject obj, string mediaURL, Primitive.TextureEntry textureEntry)
@@ -220,7 +278,7 @@ namespace Simian.Extensions
obj.Prim.MediaURL = mediaURL;
// Inform clients
BroadcastObjectUpdate(obj);
BroadcastObjectUpdate(obj.Prim);
}
public void ObjectModify(object sender, uint localID, Primitive.ConstructionData data)
@@ -237,18 +295,18 @@ namespace Simian.Extensions
obj.Prim.PrimData = data;
// Inform clients
BroadcastObjectUpdate(obj);
BroadcastObjectUpdate(obj.Prim);
}
}
public bool ContainsObject(uint localID)
{
return sceneObjects.ContainsKey(localID);
return sceneObjects.ContainsKey(localID) || sceneAgents.ContainsKey(localID);
}
public bool ContainsObject(UUID id)
{
return sceneObjects.ContainsKey(id);
return sceneObjects.ContainsKey(id) || sceneAgents.ContainsKey(id);
}
public bool TryGetObject(uint localID, out SimulationObject obj)
@@ -298,54 +356,6 @@ namespace Simian.Extensions
return true;
}
public bool AgentRemove(object sender, uint localID)
{
Agent agent;
if (sceneAgents.TryGetValue(localID, out agent))
{
if (OnAgentRemove != null)
OnAgentRemove(sender, agent);
sceneAgents.Remove(agent.Avatar.LocalID, agent.Avatar.ID);
KillObjectPacket kill = new KillObjectPacket();
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = agent.Avatar.LocalID;
server.UDP.BroadcastPacket(kill, PacketCategory.State);
return true;
}
else
{
return false;
}
}
public bool AgentRemove(object sender, UUID id)
{
Agent agent;
if (sceneAgents.TryGetValue(id, out agent))
{
if (OnAgentRemove != null)
OnAgentRemove(sender, agent);
sceneAgents.Remove(agent.Avatar.LocalID, agent.Avatar.ID);
KillObjectPacket kill = new KillObjectPacket();
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = agent.Avatar.LocalID;
server.UDP.BroadcastPacket(kill, PacketCategory.State);
return true;
}
else
{
return false;
}
}
public void AgentAppearance(object sender, Agent agent, Primitive.TextureEntry textures, byte[] visualParams)
{
if (OnAgentAppearance != null)
@@ -383,16 +393,6 @@ namespace Simian.Extensions
sceneObjects.ForEach(action);
}
public bool ContainsAgent(uint localID)
{
return sceneAgents.ContainsKey(localID);
}
public bool ContainsAgent(UUID id)
{
return sceneAgents.ContainsKey(id);
}
public bool TryGetAgent(uint localID, out Agent agent)
{
return sceneAgents.TryGetValue(localID, out agent);
@@ -408,10 +408,10 @@ namespace Simian.Extensions
sceneAgents.ForEach(action);
}
void BroadcastObjectUpdate(SimulationObject obj)
void BroadcastObjectUpdate(Primitive prim)
{
ObjectUpdatePacket update =
SimulationObject.BuildFullUpdate(obj.Prim, regionHandle, obj.Prim.Flags);
SimulationObject.BuildFullUpdate(prim, regionHandle, prim.Flags);
server.UDP.BroadcastPacket(update, PacketCategory.State);
}