OSDN Git Service

Update copyright year
[radegast/radegast.git] / Radegast / Core / RadegastMovement.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 // $Id$
30 //
31 using System;
32 using System.Timers;
33 using OpenMetaverse;
34
35 namespace Radegast
36 {
37     public class RadegastMovement : IDisposable
38     {
39         private RadegastInstance instance;
40         private GridClient client { get { return instance.Client; } }
41         private Timer timer;
42         private Vector3 forward = new Vector3(1, 0, 0);
43         private bool turningLeft = false;
44         private bool turningRight = false;
45         private bool movingForward = false;
46         private bool movingBackward = false;
47
48         public bool TurningLeft
49         {
50             get {
51                 return turningLeft;
52             }
53             set {
54                 turningLeft = value;
55                 if (value) {
56                     timer_Elapsed(null, null);
57                     timer.Enabled = true;
58                 } else {
59                     timer.Enabled = false;
60                     client.Self.Movement.TurnLeft = false;
61                     client.Self.Movement.SendUpdate(true);
62                 }
63             }
64         }
65
66         public bool TurningRight
67         {
68             get
69             {
70                 return turningRight;
71             }
72             set
73             {
74                 turningRight = value;
75                 if (value) {
76                     timer_Elapsed(null, null);
77                     timer.Enabled = true;
78                 } else {
79                     timer.Enabled = false;
80                     client.Self.Movement.TurnRight = false;
81                     client.Self.Movement.SendUpdate(true);
82                 }
83             }
84         }
85
86         public bool MovingForward
87         {
88             get
89             {
90                 return movingForward;
91             }
92             set
93             {
94                 movingForward = value;
95                 if (value) {
96                     client.Self.Movement.AtPos = true;
97                     client.Self.Movement.SendUpdate(true);
98                 } else {
99                     client.Self.Movement.AtPos = false;
100                     client.Self.Movement.SendUpdate(true);
101                 }
102             }
103         }
104
105         public bool MovingBackward
106         {
107             get
108             {
109                 return movingBackward;
110             }
111             set
112             {
113                 movingBackward = value;
114                 if (value) {
115                     client.Self.Movement.AtNeg = true;
116                     client.Self.Movement.SendUpdate(true);
117                 } else {
118                     client.Self.Movement.AtNeg = false;
119                     client.Self.Movement.SendUpdate(true);
120                     
121                 }
122             }
123         }
124
125         public RadegastMovement(RadegastInstance instance)
126         {
127             this.instance = instance;
128             timer = new System.Timers.Timer(100);
129             timer.Elapsed +=new ElapsedEventHandler(timer_Elapsed);
130             timer.Enabled = false;
131         }
132
133         public void Dispose()
134         {
135             timer.Enabled = false;
136             timer.Dispose();
137             timer = null;
138         }
139
140         void timer_Elapsed(object sender, ElapsedEventArgs e)
141         {
142             float delta = (float)timer.Interval / 1000f;
143             if (turningLeft) {
144                 client.Self.Movement.TurnLeft = true;
145                 client.Self.Movement.BodyRotation = client.Self.Movement.BodyRotation * Quaternion.CreateFromAxisAngle(Vector3.UnitZ, delta);
146                 client.Self.Movement.SendUpdate(true);
147             } else if (turningRight) {
148                 client.Self.Movement.TurnRight = true;
149                 client.Self.Movement.BodyRotation = client.Self.Movement.BodyRotation * Quaternion.CreateFromAxisAngle(Vector3.UnitZ, -delta);
150                 client.Self.Movement.SendUpdate(true);
151             }
152         }
153     }
154 }