diff --git a/OpenMetaverse/GridManager.cs b/OpenMetaverse/GridManager.cs index 2c7ab3df..6271fe5c 100644 --- a/OpenMetaverse/GridManager.cs +++ b/OpenMetaverse/GridManager.cs @@ -259,11 +259,12 @@ namespace OpenMetaverse { Client = client; - Client.Network.RegisterCallback(PacketType.MapBlockReply, new NetworkManager.PacketCallback(MapBlockReplyHandler)); - Client.Network.RegisterCallback(PacketType.MapItemReply, new NetworkManager.PacketCallback(MapItemReplyHandler)); - Client.Network.RegisterCallback(PacketType.SimulatorViewerTimeMessage, new NetworkManager.PacketCallback(TimeMessageHandler)); - Client.Network.RegisterCallback(PacketType.CoarseLocationUpdate, new NetworkManager.PacketCallback(CoarseLocationHandler)); - Client.Network.RegisterCallback(PacketType.RegionIDAndHandleReply, new NetworkManager.PacketCallback(RegionHandleReplyHandler)); + //Client.Network.RegisterCallback(PacketType.MapLayerReply, MapLayerReplyHandler); + Client.Network.RegisterCallback(PacketType.MapBlockReply, MapBlockReplyHandler); + Client.Network.RegisterCallback(PacketType.MapItemReply, MapItemReplyHandler); + Client.Network.RegisterCallback(PacketType.SimulatorViewerTimeMessage, TimeMessageHandler); + Client.Network.RegisterCallback(PacketType.CoarseLocationUpdate, CoarseLocationHandler); + Client.Network.RegisterCallback(PacketType.RegionIDAndHandleReply, RegionHandleReplyHandler); } /// diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index 77f51fa1..dc3198dc 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -28,9 +28,8 @@ namespace Simian public ulong HomeRegionHandle; public Vector3 HomePosition; public Vector3 HomeLookAt; - public ulong CurrentRegionHandle; - public Vector3 CurrentPosition; public Vector3 CurrentLookAt; + public ulong CurrentRegionHandle; // Profile public UUID PartnerID; diff --git a/Programs/Simian/Extensions/AuthFreeForAll.cs b/Programs/Simian/Extensions/AuthFreeForAll.cs index d9d06495..8758f788 100644 --- a/Programs/Simian/Extensions/AuthFreeForAll.cs +++ b/Programs/Simian/Extensions/AuthFreeForAll.cs @@ -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; diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index b9ca2279..360cfb5c 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -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 diff --git a/Programs/Simian/Extensions/FriendManager.cs b/Programs/Simian/Extensions/FriendManager.cs index 3f841896..c94ba476 100644 --- a/Programs/Simian/Extensions/FriendManager.cs +++ b/Programs/Simian/Extensions/FriendManager.cs @@ -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) { diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index e8c7d74a..ede0d225 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -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); - } } } diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs index 58a5d7cb..6bdc09ff 100644 --- a/Programs/Simian/Extensions/ObjectManager.cs +++ b/Programs/Simian/Extensions/ObjectManager.cs @@ -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; diff --git a/Programs/Simian/Extensions/Periscope.cs b/Programs/Simian/Extensions/Periscope.cs index 8985146c..9b2689d9 100644 --- a/Programs/Simian/Extensions/Periscope.cs +++ b/Programs/Simian/Extensions/Periscope.cs @@ -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); } } ); diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 9f40a9f4..a2b61e56 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -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); } diff --git a/Programs/Simian/Interfaces/ISceneProvider.cs b/Programs/Simian/Interfaces/ISceneProvider.cs index 733d2f22..6e6af591 100644 --- a/Programs/Simian/Interfaces/ISceneProvider.cs +++ b/Programs/Simian/Interfaces/ISceneProvider.cs @@ -68,11 +68,7 @@ namespace Simian void ForEachObject(Action obj); bool AgentAdd(object sender, Agent agent, PrimFlags creatorFlags); - bool AgentRemove(object sender, uint localID); - bool AgentRemove(object sender, UUID id); void AgentAppearance(object sender, Agent agent, Primitive.TextureEntry textures, byte[] visualParams); - bool ContainsAgent(uint localID); - bool ContainsAgent(UUID id); bool TryGetAgent(uint localID, out Agent agent); bool TryGetAgent(UUID id, out Agent agent); void ForEachAgent(Action action);