public void FlyTo(P3d destination) { Random rnd = new Random(); FrameLock fl = new FrameLock(false); fl.Lock(); P3d me = new P3d(isxwow.Me.X, isxwow.Me.Y, isxwow.Me.Z); fl.Unlock(); P3d tempDestination = me; P3d vektor = new P3d(1, 1, 1); destination.Z = 0; double newZ; double closeZ; double distantZ; double oldZ = me.Z; do // bis wir am endgültigen zielpunkt angekommen sind { Thread.Sleep(125); // 8x pro sekunde maximum // aktuelle position auffrischen fl.Lock(); me = new P3d(isxwow.Me.X, isxwow.Me.Y, isxwow.Me.Z); fl.Unlock(); // wir sind 20 yards nah am temporären zielort -> neuen click berechnen und ausführen if (InInterval(me.X, tempDestination.X, vektor.X * 20) && InInterval(me.Y, tempDestination.Y, vektor.Y * 20)) { newZ = me.Z; // alle z's für die nächste runde resetten, wir ermitteln neue closeZ = 0; // ist der höchste kollisionspunkt im nahbereich (bis 100 yards) distantZ = 0; // ist der höchste kollisionspunkt im fernbereich (bis 300 yards) // ermittlung des vektors vektor = new P3d(destination.X - me.X, destination.Y - me.Y, 0); double vektorLaenge = vektor.Pyth(); // umrechnung zu einheitsvektor; z ist total wayne, kennen wir eh nicht vom ziel vektor.X = vektor.X / vektorLaenge; vektor.Y = vektor.Y / vektorLaenge; // ermittle einen neuen punkt zum anklicken. 50 yards von unserer aktuellen position weg // z soll auf das ergebnis der koordinate für unser zwischenziel keine auswirkungen haben tempDestination = new P3d(vektor.X * 50 + me.X, vektor.Y * 50 + me.Y, 0); // der eigentliche zielpunkt ist näher als unsere ermittelte temporäre koordinate if (tempDestination.DistanceTo(me) > destination.DistanceTo(me)) tempDestination = destination; fl.Lock(); for (int i = 1; i < 102; i += 5) // ermittle das höchste z in 101 yards entfernung { Point3f collision = isxwow.CollisionTest(vektor.X * i + me.X, vektor.Y * i + me.Y, 0, vektor.X * i + me.X, vektor.Y * i + me.Y, 600); if (collision.Z > closeZ && collision.IsValid) closeZ = collision.Z; } for (int i = 102; i < 300; i += 5) // ermittle das höchste z in 102-~300 yards entfernung { Point3f collision = isxwow.CollisionTest(vektor.X * i + me.X, vektor.Y * i + me.Y, 0, vektor.X * i + me.X, vektor.Y * i + me.Y, 600); if (collision.Z > distantZ && collision.IsValid) distantZ = collision.Z; } if (distantZ > closeZ) // in weiter ferne ist ein berg; langsam schonmal die höhe anpassen damit man später nicht ganz so steil aufsteigen muss newZ = (distantZ - closeZ) / 3 + closeZ; else // in der nähe ist der höchste punkt, mindestens so hoch steigen newZ = closeZ; // + flughöhe + x, außer es geht zu steil bergab, dann nur um ~50 sinken if (!InInterval(oldZ, newZ + 50, 20)) // z muss angepasst werden { if ((oldZ - newZ) > 50 && newZ < oldZ) // der boden ist mehr als 50 yards tiefer { newZ = oldZ - 50; // wir möchten aber auf eine strecke von ~50 yards nicht mehr abfallen als 50 yards } else { newZ += 50; // ansonsten nimm halt das neue Z und knall 50 yards als flughöhe drauf } } else // z wurde nur minimal variiert; das kompensieren wir einfach { newZ = oldZ; } richTextBox1.BeginInvoke(new UpdateTextCallback(this.UpdateText), new object[] { "new temp loc! Z = " + newZ }); isxwow.RightClickTerrain(tempDestination.X, tempDestination.Y, newZ); oldZ = newZ; // zwischenspeichern für die z pufferung fl.Unlock(); } } while (!InInterval(me.X, destination.X, 10) && !InInterval(me.Y, destination.Y, 10)); // sind wir schon da? }