diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index 6ebb3d7e..95b91503 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -16,6 +16,7 @@ namespace Simian public string FirstName; public string LastName; public Avatar Avatar = new Avatar(); + public int Balance; public AgentManager.ControlFlags ControlFlags = AgentManager.ControlFlags.NONE; /// Sequence numbers of packets we've received (for duplicate checking) diff --git a/Programs/Simian/Extensions/Money.cs b/Programs/Simian/Extensions/Money.cs new file mode 100644 index 00000000..30c1c5c3 --- /dev/null +++ b/Programs/Simian/Extensions/Money.cs @@ -0,0 +1,72 @@ +using OpenMetaverse; +using OpenMetaverse.Packets; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Simian.Extensions +{ + class Money : ISimianExtension + { + Simian Server; + + public Money(Simian server) + { + Server = server; + } + + public void Start() + { + Server.UDPServer.RegisterPacketCallback(PacketType.MoneyBalanceRequest, new UDPServer.PacketCallback(MoneyBalanceRequestHandler)); + Server.UDPServer.RegisterPacketCallback(PacketType.MoneyTransferRequest, new UDPServer.PacketCallback(MoneyTransferRequestHandler)); + } + + public void Stop() + { + } + + void SendBalance(Agent agent, UUID transactionID, string message) + { + MoneyBalanceReplyPacket reply = new MoneyBalanceReplyPacket(); + reply.MoneyData.AgentID = agent.AgentID; + reply.MoneyData.MoneyBalance = agent.Balance; + reply.MoneyData.TransactionID = transactionID; + reply.MoneyData.Description = Utils.StringToBytes(message); + + agent.SendPacket(reply); + } + + void MoneyBalanceRequestHandler(Packet packet, Agent agent) + { + MoneyBalanceRequestPacket request = (MoneyBalanceRequestPacket)packet; + + SendBalance(agent, request.MoneyData.TransactionID, String.Empty); + } + + void MoneyTransferRequestHandler(Packet packet, Agent agent) + { + MoneyTransferRequestPacket request = (MoneyTransferRequestPacket)packet; + + if (request.MoneyData.Amount < 0 || request.MoneyData.Amount > agent.Balance) + return; + + lock (Server.Agents) + { + foreach (Agent recipient in Server.Agents.Values) + { + if (recipient.AgentID == request.MoneyData.DestID) + { + agent.Balance -= request.MoneyData.Amount; + recipient.Balance += request.MoneyData.Amount; + + SendBalance(agent, UUID.Zero, String.Format("You paid L${0} to {1}.", request.MoneyData.Amount, recipient.Avatar.Name)); + SendBalance(agent, UUID.Zero, String.Format("{1} paid you L${0}.", request.MoneyData.Amount, agent.Avatar.Name)); + + break; + } + } + } + } + + } +} diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 62fdf3b6..e0ce35b9 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -52,6 +52,9 @@ namespace Simian // Link this avatar up with the corresponding agent agent.Avatar = avatar; + // Give testers a provisionary balance of 1000L + agent.Balance = 1000; + AgentMovementCompletePacket complete = new AgentMovementCompletePacket(); complete.AgentData.AgentID = agent.AgentID; complete.AgentData.SessionID = agent.SessionID; @@ -62,6 +65,8 @@ namespace Simian complete.SimData.ChannelVersion = Utils.StringToBytes("Simian"); agent.SendPacket(complete); + + SendLayerData(agent); } void AgentWearablesRequestHandler(Packet packet, Agent agent) @@ -77,5 +82,23 @@ namespace Simian agent.SendPacket(update);*/ } + void SendLayerData(Agent agent) + { + float[] heightmap = new float[65536]; + for (int i = 0; i < heightmap.Length; i++) + heightmap[i] = 25f; + + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + int[] patches = new int[1]; + patches[0] = (y * 16) + x; + LayerDataPacket layer = TerrainCompressor.CreateLandPacket(heightmap, patches); + agent.SendPacket(layer); + } + } + } + } }