public void Fly() { FrameLock fl = new FrameLock(false); for (int i = 0; i < _NodeList.Count; i++) { P3d me; // wir haben noch kein interessantes echtes z P3d destNode = new P3d(TLocToCoord(_NodeList[i]).X, TLocToCoord(_NodeList[i]).Y, 0); richTextBox1.BeginInvoke(new UpdateTextCallback(this.UpdateText), new object[] { string.Format("Next: X: {0} Y: {1}", _NodeList[i].X, _NodeList[i].Y) }); do { Thread.Sleep(100); fl.Lock(); // aktuelle position auffrischen me = new P3d(isxwow.Me.X, isxwow.Me.Y, isxwow.Me.Z); // finde bodenhöhe, zähle 50 yards für flughöhe drauf destNode.Z = isxwow.CollisionTest(me.X, me.Y, me.Z, me.X, me.Y, 0).Z; // länge der strecke von aktuellem aufenthalsort zum ziel double pyth = me.Pyth(destNode.X, destNode.Y, destNode.Z); // ermittlung des vektors P3d vektor = new P3d(destNode.X - me.X, destNode.Y - me.Y, destNode.Z - me.Z); double vektorLaenge = vektor.Pyth(); // umrechnung zu einheitsvektor vektor.X = vektor.X / vektorLaenge; vektor.Y = vektor.Y / vektorLaenge; vektor.Z = vektor.Z / vektorLaenge; // 35 yards oder so weiter P3d zwischenPosi = new P3d(vektor.X * 300 + me.X, vektor.Y * 300 + me.Y, vektor.Z * 300 + me.Z); // wenn wir übers ziel hinaus schießen, holen wir uns das reguläre ziel wieder if (zwischenPosi.Pyth(me.X, me.Y, me.Z) > destNode.Pyth(me.X, me.Y, me.Z)) zwischenPosi = destNode; // finde kollision mit zielposition Point3f last = isxwow.CollisionTest(me.X, me.Y, me.Z, zwischenPosi.X, zwischenPosi.Y, zwischenPosi.Z); double newZ = zwischenPosi.Z; while (last.X != 0 && last.Y != 0 && last.Z != 0) { zwischenPosi.X = last.X + vektor.X * 10; zwischenPosi.Y = last.Y + vektor.Y * 10; last = isxwow.CollisionTest(me.Y, me.Y, destNode.Z, zwischenPosi.X, zwischenPosi.Y, newZ); newZ += 10; } isxwow.RightClickTerrain(zwischenPosi.X, zwischenPosi.Y, newZ+50); richTextBox1.BeginInvoke(new UpdateTextCallback(this.UpdateText), new object[] { string.Format("newZ: {0}", newZ + 50) }); fl.Unlock(); } while (!InInterval(me.X, destNode.X - 5, 5) && !InInterval(me.Y, destNode.Y - 5, 5)); } }