corrade-vassal – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 1 using System;
2  
3 namespace OpenMetaverse.TestClient.Commands.Movement
4 {
5 class FlyToCommand : Command
6 {
7  
8 Vector3 myPos = new Vector3();
9 Vector2 myPos0 = new Vector2();
10 Vector3 target = new Vector3();
11 Vector2 target0 = new Vector2();
12 float diff, olddiff, saveolddiff;
13 int startTime = 0;
14 int duration = 10000;
15 bool running = false;
16  
17 public FlyToCommand(TestClient Client)
18 {
19 Name = "FlyTo";
20 Description = "Fly the avatar toward the specified position for a maximum of seconds. Usage: FlyTo x y z [seconds]";
21 Category = CommandCategory.Movement;
22 }
23  
24 public override string Execute(string[] args, UUID fromAgentID)
25 {
26 if (args.Length > 4 || args.Length < 3)
27 return "Usage: FlyTo x y z [seconds]";
28  
29 if (!float.TryParse(args[0], out target.X) ||
30 !float.TryParse(args[1], out target.Y) ||
31 !float.TryParse(args[2], out target.Z))
32 {
33 return "Usage: FlyTo x y z [seconds]";
34 }
35  
36 if (running)
37 return "Already in progress, wait for the previous FlyTo to finish";
38  
39 running = true;
40  
41 // Subscribe to terse update events while this command is running
42 Client.Objects.TerseObjectUpdate += Objects_OnObjectUpdated;
43  
44 target0.X = target.X;
45 target0.Y = target.Y;
46  
47 if (args.Length == 4 && Int32.TryParse(args[3], out duration))
48 duration *= 1000;
49  
50 startTime = Environment.TickCount;
51 Client.Self.Movement.Fly = true;
52 Client.Self.Movement.AtPos = true;
53 Client.Self.Movement.AtNeg = false;
54 ZMovement();
55 Client.Self.Movement.TurnToward(target);
56  
57 return string.Format("flying to {0} in {1} seconds", target.ToString(), duration / 1000);
58 }
59  
60 private void Objects_OnObjectUpdated(object sender, TerseObjectUpdateEventArgs e)
61 {
62 if (startTime == 0) return;
63 if (e.Update.LocalID == Client.Self.LocalID)
64 {
65 XYMovement();
66 ZMovement();
67 if (Client.Self.Movement.AtPos || Client.Self.Movement.AtNeg)
68 {
69 Client.Self.Movement.TurnToward(target);
70 Debug("Flyxy ");
71 }
72 else if (Client.Self.Movement.UpPos || Client.Self.Movement.UpNeg)
73 {
74 Client.Self.Movement.TurnToward(target);
75 //Client.Self.Movement.SendUpdate(false);
76 Debug("Fly z ");
77 }
78 else if (Vector3.Distance(target, Client.Self.SimPosition) <= 2.0)
79 {
80 EndFlyto();
81 Debug("At Target");
82 }
83 }
84 if (Environment.TickCount - startTime > duration)
85 {
86 EndFlyto();
87 Debug("End Flyto");
88 }
89 }
90  
91 private bool XYMovement()
92 {
93 bool res = false;
94  
95 myPos = Client.Self.SimPosition;
96 myPos0.X = myPos.X;
97 myPos0.Y = myPos.Y;
98 diff = Vector2.Distance(target0, myPos0);
99 Vector2 vvel = new Vector2(Client.Self.Velocity.X, Client.Self.Velocity.Y);
100 float vel = vvel.Length();
101 if (diff >= 10.0)
102 {
103 Client.Self.Movement.AtPos = true;
104  
105 res = true;
106 }
107 else if (diff >= 2 && vel < 5)
108 {
109 Client.Self.Movement.AtPos = true;
110 }
111 else
112 {
113 Client.Self.Movement.AtPos = false;
114 Client.Self.Movement.AtNeg = false;
115 }
116 saveolddiff = olddiff;
117 olddiff = diff;
118 return res;
119 }
120  
121 private void ZMovement()
122 {
123 Client.Self.Movement.UpPos = false;
124 Client.Self.Movement.UpNeg = false;
125 float diffz = (target.Z - Client.Self.SimPosition.Z);
126 if (diffz >= 20.0)
127 Client.Self.Movement.UpPos = true;
128 else if (diffz <= -20.0)
129 Client.Self.Movement.UpNeg = true;
130 else if (diffz >= +5.0 && Client.Self.Velocity.Z < +4.0)
131 Client.Self.Movement.UpPos = true;
132 else if (diffz <= -5.0 && Client.Self.Velocity.Z > -4.0)
133 Client.Self.Movement.UpNeg = true;
134 else if (diffz >= +2.0 && Client.Self.Velocity.Z < +1.0)
135 Client.Self.Movement.UpPos = true;
136 else if (diffz <= -2.0 && Client.Self.Velocity.Z > -1.0)
137 Client.Self.Movement.UpNeg = true;
138 }
139  
140 private void EndFlyto()
141 {
142 // Unsubscribe from terse update events
143 Client.Objects.TerseObjectUpdate -= Objects_OnObjectUpdated;
144  
145 startTime = 0;
146 Client.Self.Movement.AtPos = false;
147 Client.Self.Movement.AtNeg = false;
148 Client.Self.Movement.UpPos = false;
149 Client.Self.Movement.UpNeg = false;
150 Client.Self.Movement.SendUpdate(false);
151  
152 running = false;
153 }
154  
155 [System.Diagnostics.Conditional("DEBUG")]
156 private void Debug(string x)
157 {
158 Console.WriteLine(x + " {0,3:##0} {1,3:##0} {2,3:##0} diff {3,5:##0.0} olddiff {4,5:##0.0} At:{5,5} {6,5} Up:{7,5} {8,5} v: {9} w: {10}",
159 myPos.X, myPos.Y, myPos.Z, diff, saveolddiff,
160 Client.Self.Movement.AtPos, Client.Self.Movement.AtNeg, Client.Self.Movement.UpPos, Client.Self.Movement.UpNeg,
161 Client.Self.Velocity.ToString(), Client.Self.AngularVelocity.ToString());
162 }
163 }
164 }