All pastes #930456 Raw Edit

Zeug

public text v1 · immutable
·published 2008-03-06 16:42 UTC
rendered paste body
        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?
        }