diff --git a/libsecondlife-cs/MainAvatar.cs b/libsecondlife-cs/MainAvatar.cs index a9622ac7..c260c730 100644 --- a/libsecondlife-cs/MainAvatar.cs +++ b/libsecondlife-cs/MainAvatar.cs @@ -232,7 +232,7 @@ namespace libsecondlife /// public enum ChatType : byte { - /// Whispers (5m radius) + /// Whisper (5m radius) Whisper = 0, /// Normal chat (10/20m radius), what the official viewer typically sends Normal = 1, @@ -240,11 +240,40 @@ namespace libsecondlife Shout = 2, /// Say chat (10/20m radius) - The official viewer will /// print "[4:15] You say, hey" instead of "[4:15] You: hey" + [Obsolete] Say = 3, /// Event message when an Avatar has begun to type StartTyping = 4, /// Event message when an Avatar has stopped typing - StopTyping = 5 + StopTyping = 5, + /// Unknown + Debug = 6 + } + + /// + /// Identifies the source of a chat message + /// + public enum ChatSourceType : byte + { + /// Chat from the grid or simulator + System = 0, + /// Chat from another avatar + Agent = 1, + /// Chat from an object + Object = 2 + } + + /// + /// + /// + public enum ChatAudibleLevel : sbyte + { + /// + Not = -1, + /// + Barely = 0, + /// + Fully = 1 } /// @@ -392,14 +421,14 @@ namespace libsecondlife /// /// Triggered on incoming chat messages /// - /// Text of chat message - /// Is this normal audible chat or not. - /// Type of chat (whisper,shout,status,etc) - /// Type of source (Agent / Object / ???) - /// Text name of sending Avatar/Object + /// Text of chat message + /// Audible level of this chat message + /// Type of chat (whisper, shout, status, etc.) + /// Source of the chat message + /// Name of the sending object /// - public delegate void ChatCallback(string message, byte audible, byte type, byte sourcetype, - string fromName, LLUUID id, LLUUID ownerid, LLVector3 position); + public delegate void ChatCallback(string message, ChatAudibleLevel audible, ChatType type, + ChatSourceType sourceType, string fromName, LLUUID id, LLUUID ownerid, LLVector3 position); /// /// Triggered when a script pops up a dialog box @@ -1549,9 +1578,9 @@ namespace libsecondlife ChatFromSimulatorPacket chat = (ChatFromSimulatorPacket)packet; OnChat(Helpers.FieldToUTF8String(chat.ChatData.Message) - , chat.ChatData.Audible - , chat.ChatData.ChatType - , chat.ChatData.SourceType + , (ChatAudibleLevel)chat.ChatData.Audible + , (ChatType)chat.ChatData.ChatType + , (ChatSourceType)chat.ChatData.SourceType , Helpers.FieldToUTF8String(chat.ChatData.FromName) , chat.ChatData.SourceID , chat.ChatData.OwnerID diff --git a/libsecondlife-cs/MainAvatarStatus.cs b/libsecondlife-cs/MainAvatarStatus.cs index df49f247..63241034 100644 --- a/libsecondlife-cs/MainAvatarStatus.cs +++ b/libsecondlife-cs/MainAvatarStatus.cs @@ -38,30 +38,6 @@ namespace libsecondlife /// public class MainAvatarStatus { - - bool alwaysRun = false; - - /// - /// Returns "always run" value, or changes it by sending a SetAlwaysRunPacket - /// - public bool AlwaysRun - { - get - { - return alwaysRun; - } - set - { - alwaysRun = value; - SetAlwaysRunPacket run = new SetAlwaysRunPacket(); - run.AgentData.AgentID = Client.Network.AgentID; - run.AgentData.SessionID = Client.Network.SessionID; - run.AgentData.AlwaysRun = alwaysRun; - Client.Network.SendPacket(run); - } - } - - /// /// Contains properties for client control key states /// @@ -70,194 +46,194 @@ namespace libsecondlife /// public bool AtPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS, value); } } /// public bool AtNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG, value); } } /// public bool LeftPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_POS, value); } } /// public bool LeftNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LEFT_NEG, value); } } /// public bool UpPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS, value); } } /// public bool UpNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG, value); } } /// public bool PitchPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_POS, value); } } /// public bool PitchNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_PITCH_NEG, value); } } /// public bool YawPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_POS, value); } } /// public bool YawNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_YAW_NEG, value); } } /// public bool FastAt { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_AT); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_AT, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_AT); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_AT, value); } } /// public bool FastLeft { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_LEFT); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_LEFT, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_LEFT); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_LEFT, value); } } /// public bool FastUp { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_UP); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_UP, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_UP); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FAST_UP, value); } } /// public bool Fly { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY, value); } } /// public bool Stop { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STOP); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STOP, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STOP); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STOP, value); } } /// public bool FinishAnim { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FINISH_ANIM); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FINISH_ANIM, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FINISH_ANIM); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FINISH_ANIM, value); } } /// public bool StandUp { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STAND_UP); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STAND_UP, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STAND_UP); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_STAND_UP, value); } } /// public bool SitOnGround { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_SIT_ON_GROUND); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_SIT_ON_GROUND, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_SIT_ON_GROUND); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_SIT_ON_GROUND, value); } } /// public bool Mouselook { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_MOUSELOOK); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_MOUSELOOK, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_MOUSELOOK); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_MOUSELOOK, value); } } /// public bool NudgeAtPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_POS, value); } } /// public bool NudgeAtNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_AT_NEG, value); } } /// public bool NudgeLeftPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_POS, value); } } /// public bool NudgeLeftNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_LEFT_NEG, value); } } /// public bool NudgeUpPos { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_POS); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_POS, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_POS); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_POS, value); } } /// public bool NudgeUpNeg { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_NEG); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_NEG, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_NEG); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_NUDGE_UP_NEG, value); } } /// public bool TurnLeft { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_LEFT); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_LEFT, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_LEFT); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_LEFT, value); } } /// public bool TurnRight { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_RIGHT); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_RIGHT, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_RIGHT); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_TURN_RIGHT, value); } } /// public bool Away { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AWAY); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AWAY, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AWAY); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AWAY, value); } } /// public bool LButtonDown { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_DOWN); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_DOWN, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_DOWN); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_DOWN, value); } } /// public bool LButtonUp { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_UP); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_UP, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_UP); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_LBUTTON_UP, value); } } /// public bool MLButtonDown { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_DOWN); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_DOWN, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_DOWN); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_DOWN, value); } } /// public bool MLButtonUp { - get { return getControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_UP); } - set { setControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_UP, value); } + get { return GetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_UP); } + set { SetControlFlag(MainAvatar.AgentUpdateFlags.AGENT_CONTROL_ML_LBUTTON_UP, value); } } } @@ -296,13 +272,30 @@ namespace libsecondlife /// public CameraStatus Camera; - /// The current value of the agent control flags - public uint AgentControls + /// + /// Returns "always run" value, or changes it by sending a SetAlwaysRunPacket + /// + public bool AlwaysRun { - get { return agentControls; } + get + { + return alwaysRun; + } + set + { + alwaysRun = value; + SetAlwaysRunPacket run = new SetAlwaysRunPacket(); + run.AgentData.AgentID = Client.Network.AgentID; + run.AgentData.SessionID = Client.Network.SessionID; + run.AgentData.AlwaysRun = alwaysRun; + Client.Network.SendPacket(run); + } } + /// The current value of the agent control flags + public uint AgentControls { get { return agentControls; } } + private bool alwaysRun = false; private SecondLife Client; private static uint agentControls; @@ -315,7 +308,7 @@ namespace libsecondlife // Lets set some default camera values Camera.BodyRotation = LLQuaternion.Identity; Camera.HeadRotation = LLQuaternion.Identity; - Camera.CameraCenter = new LLVector3(128,128,20); // this cannot be set to Client.Self.Position because this is constructed before we're in-world + Camera.CameraCenter = new LLVector3(128,128,20); Camera.CameraAtAxis = new LLVector3(0, 0.9999f, 0); Camera.CameraLeftAxis = new LLVector3(0.9999f, 0, 0); Camera.CameraUpAxis = new LLVector3(0, 0, 0.9999f); @@ -327,8 +320,6 @@ namespace libsecondlife UpdateTimer.Enabled = false; } - - /// /// Send new AgentUpdate /// @@ -351,13 +342,13 @@ namespace libsecondlife Client.Network.SendPacket(update); } - private static bool getControlFlag(MainAvatar.AgentUpdateFlags flag) + private static bool GetControlFlag(MainAvatar.AgentUpdateFlags flag) { uint control = (uint)flag; return ((agentControls & control) == control); } - private static void setControlFlag(MainAvatar.AgentUpdateFlags flag, bool value) + private static void SetControlFlag(MainAvatar.AgentUpdateFlags flag, bool value) { uint control = (uint)flag; if (value && ((agentControls & control) != control)) agentControls ^= control; @@ -366,8 +357,11 @@ namespace libsecondlife private void UpdateTimer_Elapsed(object sender, ElapsedEventArgs e) { - //Send an AgentUpdate packet - SendUpdate(); + if (Client.Network.Connected) + { + //Send an AgentUpdate packet + SendUpdate(); + } } } } diff --git a/libsecondlife-cs/NetworkManager.cs b/libsecondlife-cs/NetworkManager.cs index f9bb78bd..876b01ee 100644 --- a/libsecondlife-cs/NetworkManager.cs +++ b/libsecondlife-cs/NetworkManager.cs @@ -461,59 +461,6 @@ namespace libsecondlife return "uri:" + sim.ToLower() + "&" + x + "&" + y + "&" + z; } - /// - /// - /// - /// - /// - /// - /// - /// - /// - public Dictionary DefaultLoginValues(string firstName, string lastName, - string password, string userAgent, string author) - { - return DefaultLoginValues(firstName, lastName, password, "00:00:00:00:00:00", "last", - 1, 50, 50, 50, "Win", "0", userAgent, author, false); - } - - /// - /// - /// - /// - /// - /// - /// - /// - /// - public Dictionary DefaultLoginValues(string firstName, string lastName, - string password, string startLocation, string userAgent, string author, bool md5pass) - { - return DefaultLoginValues(firstName, lastName, password, "00:00:00:00:00:00", startLocation, - 1, 50, 50, 50, "Win", "0", userAgent, author, md5pass); - } - - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public Dictionary DefaultLoginValues(string firstName, string lastName, - string password, string mac, string startLocation, string platform, - string viewerDigest, string userAgent, string author) - { - return DefaultLoginValues(firstName, lastName, password, mac, startLocation, - 1, 50, 50, 50, platform, viewerDigest, userAgent, author, false); - } - /// /// /// @@ -611,8 +558,26 @@ namespace libsecondlife /// LoginError string will contain the error public bool Login(string firstName, string lastName, string password, string userAgent, string author) { - Dictionary loginParams = DefaultLoginValues(firstName, lastName, - password, "last", userAgent, author, false); + Dictionary loginParams = DefaultLoginValues(firstName, lastName, password, + "00:00:00:00:00:00", "last", 1, 50, 50, 50, "Win", "0", userAgent, author, false); + return Login(loginParams); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public bool Login(string firstName, string lastName, string password, string userAgent, string author, + bool md5pass) + { + Dictionary loginParams = DefaultLoginValues(firstName, lastName, password, + "00:00:00:00:00:00", "last", 1, 50, 50, 50, "Win", "0", userAgent, author, md5pass); return Login(loginParams); } @@ -635,8 +600,8 @@ namespace libsecondlife public bool Login(string firstName, string lastName, string password, string userAgent, string start, string author, bool md5pass) { - Dictionary loginParams = DefaultLoginValues(firstName, lastName, - password, start, userAgent, author, md5pass); + Dictionary loginParams = DefaultLoginValues(firstName, lastName, password, + "00:00:00:00:00:00", start, 1, 50, 50, 50, "Win", "0", userAgent, author, md5pass); return Login(loginParams); } @@ -913,7 +878,7 @@ namespace libsecondlife if (setDefault) { Simulator oldSim = CurrentSim; - CurrentSim = simulator; + lock (Simulators) CurrentSim = simulator; if (CurrentCaps != null) CurrentCaps.Disconnect(); CurrentCaps = null; @@ -1058,28 +1023,17 @@ namespace libsecondlife lock (Simulators) { // Disconnect all simulators except the current one - foreach (Simulator simulator in Simulators) + for (int i = 0; i < Simulators.Count; i++) { - // Don't disconnect the current sim, we'll use LogoutRequest for that - if (simulator != null && simulator != CurrentSim) + if (Simulators[i] != null && Simulators[i] != CurrentSim) { - DisconnectSim(simulator); + DisconnectSim(Simulators[i]); // Fire the SimDisconnected event if a handler is registered - // FIXME: This is a recipe for disaster. Firing an event when we - // are locking is just inviting someone to call a function that - // locks in Simulators and deadlocks the library if (OnSimDisconnected != null) { - try - { - OnSimDisconnected(simulator, DisconnectType.NetworkTimeout); - } - catch (Exception e) - { - Client.Log("Caught an exception in OnSimDisconnected(): " + e.ToString(), - Helpers.LogLevel.Error); - } + try { OnSimDisconnected(Simulators[i], DisconnectType.NetworkTimeout); } + catch (Exception e) { Client.Log(e.ToString(), Helpers.LogLevel.Error); } } } } @@ -1092,7 +1046,7 @@ namespace libsecondlife Simulator oldSim = CurrentSim; DisconnectSim(CurrentSim); - CurrentSim = null; + lock (Simulators) CurrentSim = null; if (OnCurrentSimChanged != null) { @@ -1180,20 +1134,18 @@ namespace libsecondlife // Check all of the connected sims for disconnects lock (Simulators) { - foreach (Simulator sim in Simulators) + for (int i = 0; i < Simulators.Count; i++) { - if (sim.DisconnectCandidate) + if (Simulators[i].DisconnectCandidate) { if (disconnectedSims == null) - { disconnectedSims = new List(); - } - disconnectedSims.Add(sim); + disconnectedSims.Add(Simulators[i]); } else { - sim.DisconnectCandidate = true; + Simulators[i].DisconnectCandidate = true; } } } @@ -1201,16 +1153,16 @@ namespace libsecondlife // Actually disconnect each sim we detected as disconnected if (disconnectedSims != null) { - foreach (Simulator sim in disconnectedSims) + for (int i = 0; i < disconnectedSims.Count; i++) { - if (sim != null) + if (disconnectedSims[i] != null) { // This sim hasn't received any network traffic since the // timer last elapsed, consider it disconnected - Client.Log("Network timeout for simulator " + sim.ToString() + + Client.Log("Network timeout for simulator " + disconnectedSims[i].ToString() + ", disconnecting", Helpers.LogLevel.Warning); - DisconnectSim(sim); + DisconnectSim(disconnectedSims[i]); } } } diff --git a/libsecondlife-cs/ObjectManager.cs b/libsecondlife-cs/ObjectManager.cs index e1973066..3f51ee32 100644 --- a/libsecondlife-cs/ObjectManager.cs +++ b/libsecondlife-cs/ObjectManager.cs @@ -329,6 +329,14 @@ namespace libsecondlife Undergrowth1 } + public enum SaleType : byte + { + Not = 0, + Original = 1, + Copy = 2, + Contents = 3 + } + #endregion @@ -512,6 +520,64 @@ namespace libsecondlife Client.Network.SendPacket(request, simulator); } + /// + /// Attempt to purchase an original object, a copy, or the contents of + /// an object + /// + /// Simulator where the object resides + /// Sim-local ID of the object + /// Whether the original, a copy, or the object + /// contents are on sale. This is used for verification, if the this + /// sale type is not valid for the object the purchase will fail + /// Price of the object. This is used for + /// verification, if it does not match the actual price the purchase + /// will fail + /// Group ID that will be associated with the new + /// purchase + /// Inventory folder UUID where the purchase + /// should go + /// BuyObject(Client.Network.CurrentSim, 500, SaleType.Copy, + /// 100, LLUUID.Zero, Client.Self.InventoryRootFolderUUID); + public void BuyObject(Simulator simulator, uint localID, SaleType saleType, int price, LLUUID groupID, + LLUUID categoryID) + { + ObjectBuyPacket buy = new ObjectBuyPacket(); + + buy.AgentData.AgentID = Client.Network.AgentID; + buy.AgentData.SessionID = Client.Network.SessionID; + buy.AgentData.GroupID = groupID; + buy.AgentData.CategoryID = categoryID; + + buy.ObjectData = new ObjectBuyPacket.ObjectDataBlock[1]; + buy.ObjectData[0] = new ObjectBuyPacket.ObjectDataBlock(); + buy.ObjectData[0].ObjectLocalID = localID; + buy.ObjectData[0].SaleType = (byte)saleType; + buy.ObjectData[0].SalePrice = price; + + Client.Network.SendPacket(buy, simulator); + } + + /// + /// Select an object. This will trigger the simulator to send us back + /// an ObjectProperties packet so we can get the full information for + /// this object + /// + /// Simulator where the object resides + /// Sim-local ID of the object to select + public void SelectObject(Simulator simulator, uint localID) + { + ObjectSelectPacket select = new ObjectSelectPacket(); + + select.AgentData.AgentID = Client.Network.AgentID; + select.AgentData.SessionID = Client.Network.SessionID; + + select.ObjectData = new ObjectSelectPacket.ObjectDataBlock[1]; + select.ObjectData[0] = new ObjectSelectPacket.ObjectDataBlock(); + select.ObjectData[0].ObjectLocalID = localID; + + Client.Network.SendPacket(select, simulator); + } + /// /// Create, or "rez" a new prim object in a simulator /// diff --git a/libsecondlife-cs/Simulator.cs b/libsecondlife-cs/Simulator.cs index 27289e1d..80988a76 100644 --- a/libsecondlife-cs/Simulator.cs +++ b/libsecondlife-cs/Simulator.cs @@ -481,8 +481,8 @@ namespace libsecondlife { if (now - packet.TickCount > Client.Settings.RESEND_TIMEOUT) { - Client.Log("Resending " + packet.Type.ToString() + " packet (" + packet.Header.Sequence + - "), " + (now - packet.TickCount) + "ms have passed", Helpers.LogLevel.Info); + Client.DebugLog("Resending " + packet.Type.ToString() + " packet (" + packet.Header.Sequence + + "), " + (now - packet.TickCount) + "ms have passed"); packet.Header.Resent = true; SendPacket(packet, false); @@ -561,10 +561,9 @@ namespace libsecondlife // Check if we already received this packet if (Inbox.Contains(packet.Header.Sequence)) { - Client.Log("Received a duplicate " + packet.Type.ToString() + ", sequence=" + + Client.DebugLog("Received a duplicate " + packet.Type.ToString() + ", sequence=" + packet.Header.Sequence + ", resent=" + ((packet.Header.Resent) ? "Yes" : "No") + - ", Inbox.Count=" + Inbox.Count + ", NeedAck.Count=" + NeedAck.Count, - Helpers.LogLevel.Info); + ", Inbox.Count=" + Inbox.Count + ", NeedAck.Count=" + NeedAck.Count); // Avoid firing a callback twice for the same packet return; diff --git a/libsecondlife-cs/examples/Heightmap/frmHeightmap.cs b/libsecondlife-cs/examples/Heightmap/frmHeightmap.cs index f0b16d0b..76373ab5 100644 --- a/libsecondlife-cs/examples/Heightmap/frmHeightmap.cs +++ b/libsecondlife-cs/examples/Heightmap/frmHeightmap.cs @@ -60,10 +60,7 @@ namespace Heightmap // Only needed so we can do lookups with TerrainHeightAtPoint Client.Settings.STORE_LAND_PATCHES = true; - Dictionary loginvals = Client.Network.DefaultLoginValues(FirstName, LastName, Password, - "Heightmap", "jhurliman@wsu.edu"); - - if (!Client.Network.Login(loginvals)) //, "https://login.aditi.lindenlab.com/cgi-bin/login.cgi")) + if (!Client.Network.Login(FirstName, LastName, Password, "Heightmap", "jhurliman@wsu.edu")) { Console.WriteLine("Login failed: " + Client.Network.LoginError); Console.ReadKey(); diff --git a/libsecondlife-cs/examples/TestClient/Commands/Communication/EchoMasterCommand.cs b/libsecondlife-cs/examples/TestClient/Commands/Communication/EchoMasterCommand.cs index 721b5c98..ad7c699c 100644 --- a/libsecondlife-cs/examples/TestClient/Commands/Communication/EchoMasterCommand.cs +++ b/libsecondlife-cs/examples/TestClient/Commands/Communication/EchoMasterCommand.cs @@ -30,7 +30,8 @@ namespace libsecondlife.TestClient } } - void Self_OnChat(string message, byte audible, byte type, byte sourcetype, string fromName, LLUUID id, LLUUID ownerid, LLVector3 position) + void Self_OnChat(string message, MainAvatar.ChatAudibleLevel audible, MainAvatar.ChatType type, + MainAvatar.ChatSourceType sourcetype, string fromName, LLUUID id, LLUUID ownerid, LLVector3 position) { if (message.Length > 0 && Client.Master == fromName) { diff --git a/libsecondlife-cs/examples/TestClient/TestClient.cs b/libsecondlife-cs/examples/TestClient/TestClient.cs index 3df8f8d1..b390e70f 100644 --- a/libsecondlife-cs/examples/TestClient/TestClient.cs +++ b/libsecondlife-cs/examples/TestClient/TestClient.cs @@ -125,7 +125,7 @@ namespace libsecondlife.TestClient // "all balance" will send the balance command to all currently logged in bots if (firstToken == "all" && tokens.Length > 1) { - cmd = ""; + cmd = String.Empty; // Reserialize all of the arguments except for "all" for (int i = 1; i < tokens.Length; i++) @@ -156,8 +156,7 @@ namespace libsecondlife.TestClient private void updateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { - Self.UpdateCamera(0, Self.Position, forward, left, up, bodyRotation, - LLQuaternion.Identity, DrawDistance, false); + this.Self.Status.SendUpdate(); foreach (Command c in Commands.Values) if (c.Active) diff --git a/libsecondlife-cs/examples/groupmanager/frmGroupManager.cs b/libsecondlife-cs/examples/groupmanager/frmGroupManager.cs index 056c20cb..19f1750d 100644 --- a/libsecondlife-cs/examples/groupmanager/frmGroupManager.cs +++ b/libsecondlife-cs/examples/groupmanager/frmGroupManager.cs @@ -59,11 +59,8 @@ namespace groupmanager cmdConnect.Text = "Disconnect"; txtFirstName.Enabled = txtLastName.Enabled = txtPassword.Enabled = false; - Dictionary loginParams = Client.Network.DefaultLoginValues(txtFirstName.Text, - txtLastName.Text, txtPassword.Text, "00:00:00:00:00:00", "last", - "Win", "0", "groupmanager", "jhurliman@wsu.edu"); - - if (Client.Network.Login(loginParams)) + if (Client.Network.Login(txtFirstName.Text, txtLastName.Text, txtPassword.Text, "GroupManager", + "jhurliman@wsu.edu")) { groupBox.Enabled = true; diff --git a/libsecondlife-cs/examples/name2key/name2key.cs b/libsecondlife-cs/examples/name2key/name2key.cs index 7084e053..af08cc0a 100644 --- a/libsecondlife-cs/examples/name2key/name2key.cs +++ b/libsecondlife-cs/examples/name2key/name2key.cs @@ -76,11 +76,7 @@ namespace name2key // FIXME: Rewrite this code as soon as people searching is added to DirectoryManager client.Network.RegisterCallback(PacketType.DirPeopleReply, new NetworkManager.PacketCallback(QueryHandler)); - // Setup the login values - Dictionary loginParams = client.Network.DefaultLoginValues(args[0], args[1], args[2], - "00:00:00:00:00:00", "last", "Win", "0", "name2key", "jhurliman@wsu.edu"); - - if (!client.Network.Login(loginParams)) + if (!client.Network.Login(args[0], args[1], args[2], "name2key", "jhurliman@wsu.edu")) { // Login failed Console.WriteLine("ERROR: " + client.Network.LoginError);