2 // Radegast Metaverse Client
3 //Copyright (c) 2009-2014, Radegast Development Team
4 // All rights reserved.
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
9 // * Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution.
14 // * Neither the name of the application "Radegast", nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 using System.Collections.Generic;
38 using OpenMetaverse.StructuredData;
40 namespace Radegast.Automation
42 public class PseudoHomePreferences
44 public bool Enabled { get; set; }
45 public string Region { get; set; }
46 public Vector3 Position { get; set; }
47 public uint Tolerance { get; set; }
49 public PseudoHomePreferences()
54 public static explicit operator PseudoHomePreferences(OSD osd)
56 PseudoHomePreferences prefs = new PseudoHomePreferences();
58 if (osd != null && osd.Type == OSDType.Map)
60 OSDMap map = (OSDMap)osd;
61 prefs.Enabled = map.ContainsKey("Enabled") ? map["Enabled"].AsBoolean() : false;
62 prefs.Region = map.ContainsKey("Region") ? map["Region"].AsString().Trim() : "";
63 prefs.Position = map.ContainsKey("Position") ? map["Position"].AsVector3() : new Vector3();
64 prefs.Tolerance = map.ContainsKey("Tolerance") ? Math.Min(256, Math.Max(1, map["Tolerance"].AsUInteger())) : 256;
70 public static implicit operator OSD(PseudoHomePreferences prefs)
75 public static explicit operator OSDMap(PseudoHomePreferences prefs)
77 OSDMap map = new OSDMap(4);
79 map["Enabled"] = prefs != null ? prefs.Enabled : false;
80 map["Region"] = prefs != null && prefs.Region != null ? prefs.Region.Trim() : string.Empty;
81 map["Position"] = prefs != null ? prefs.Position : Vector3.Zero;
82 map["Tolerance"] = prefs != null ? prefs.Tolerance : 256;
87 public static explicit operator PseudoHomePreferences(Settings s)
89 return (s != null && s.ContainsKey("PseudoHome")) ? (PseudoHomePreferences)s["PseudoHome"] : new PseudoHomePreferences
93 Position = Vector3.Zero,
99 public class PseudoHome
101 private RadegastInstance m_instance;
102 private Timer m_Timer;
104 public PseudoHome(RadegastInstance instance)
106 m_instance = instance;
107 m_Timer = new Timer(5000);
108 m_Timer.Elapsed += new ElapsedEventHandler((sender, args) => {
111 m_Timer.Enabled = false;
114 public PseudoHomePreferences Preferences
116 get { return !m_instance.Client.Network.Connected ? null : (PseudoHomePreferences)m_instance.ClientSettings; }
120 m_instance.ClientSettings["PseudoHome"] = value;
124 public void ETGoHome()
126 if (Preferences != null && m_instance.Client.Network.Connected && Preferences.Region.Trim() != string.Empty)
128 if (Preferences.Enabled && (m_instance.Client.Network.CurrentSim.Name != Preferences.Region || Vector3.Distance(m_instance.Client.Self.SimPosition, Preferences.Position) > Preferences.Tolerance))
130 m_instance.Client.Self.Teleport(Preferences.Region, Preferences.Position);
131 m_Timer.Enabled = true;
135 m_Timer.Enabled = false;
140 m_Timer.Enabled = false;