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?
}