OSDN Git Service

RAD-493: Added context menu to group chat
[radegast/radegast.git] / Radegast / Automation / PseudoHome.cs
1 // 
2 // Radegast Metaverse Client
3 //Copyright (c) 2009-2014, Radegast Development Team
4 // All rights reserved.
5 // 
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
8 // 
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.
17 // 
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.
28 //
29 // Implements RAD-354
30
31 using System;
32 using System.Collections.Generic;
33 using System.Linq;
34 using System.Text;
35 using System.Timers;
36
37 using OpenMetaverse;
38 using OpenMetaverse.StructuredData;
39
40 namespace Radegast.Automation
41 {
42     public class PseudoHomePreferences
43     {
44         public bool Enabled { get; set; }
45         public string Region { get; set; }
46         public Vector3 Position { get; set; }
47         public uint Tolerance { get; set; }
48
49         public PseudoHomePreferences()
50         {
51             Tolerance = 256;
52         }
53
54         public static explicit operator PseudoHomePreferences(OSD osd)
55         {
56             PseudoHomePreferences prefs = new PseudoHomePreferences();
57
58             if (osd != null && osd.Type == OSDType.Map)
59             {
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;
65             }
66
67             return prefs;
68         }
69
70         public static implicit operator OSD(PseudoHomePreferences prefs)
71         {
72             return (OSDMap)prefs;
73         }
74
75         public static explicit operator OSDMap(PseudoHomePreferences prefs)
76         {
77             OSDMap map = new OSDMap(4);
78
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;
83
84             return map;
85         }
86
87         public static explicit operator PseudoHomePreferences(Settings s)
88         {
89             return (s != null && s.ContainsKey("PseudoHome")) ? (PseudoHomePreferences)s["PseudoHome"] : new PseudoHomePreferences
90             {
91                 Enabled = false,
92                 Region = "",
93                 Position = Vector3.Zero,
94                 Tolerance = 256
95             };
96         }
97     }
98
99     public class PseudoHome
100     {
101         private RadegastInstance m_instance;
102         private Timer m_Timer;
103
104         public PseudoHome(RadegastInstance instance)
105         {
106             m_instance = instance;
107             m_Timer = new Timer(5000);
108             m_Timer.Elapsed += new ElapsedEventHandler((sender, args) => {
109                 ETGoHome();
110             });
111             m_Timer.Enabled = false;
112         }
113
114         public PseudoHomePreferences Preferences
115         {
116             get { return !m_instance.Client.Network.Connected ? null : (PseudoHomePreferences)m_instance.ClientSettings; }
117
118             set
119             {
120                 m_instance.ClientSettings["PseudoHome"] = value;
121             }
122         }
123
124         public void ETGoHome()
125         {
126             if (Preferences != null && m_instance.Client.Network.Connected && Preferences.Region.Trim() != string.Empty)
127             {
128                 if (Preferences.Enabled && (m_instance.Client.Network.CurrentSim.Name != Preferences.Region || Vector3.Distance(m_instance.Client.Self.SimPosition, Preferences.Position) > Preferences.Tolerance))
129                 {
130                     m_instance.Client.Self.Teleport(Preferences.Region, Preferences.Position);
131                     m_Timer.Enabled = true;
132                 }
133                 else
134                 {
135                     m_Timer.Enabled = false;
136                 }
137             }
138             else
139             {
140                 m_Timer.Enabled = false;
141             }
142         }
143     }
144 }