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);