Jump to content

Scheduler wird nicht gecancelled?


Empfohlene Beiträge

Hallo,

ich habe ein Problem mit einem Vector und einem Scheduler.
Hier erstmal der Code, dann kann ich besser mein Problem erklären:

Location start = bossHead.getLocation();
                Location ziel = new Location(bossHead.getWorld(), 49.5, 130, 1.5, 90, 2);
                Location loc = bossHead.getLocation();
                new BukkitRunnable(){

                    double distance = 0;

                    Vector dir = ziel.toVector().subtract(start.toVector());

                    @Override
                    public void run(){
                        distance = distance + 0.1;
                        double x = dir.getX()* distance + 0.05;
                        double y = dir.getY()* distance;
                        double z = dir.getZ()* distance + 0.05;



                        loc.add(x, y, z);


                        sendEffectforAll(EnumParticle.FLAME, loc, 1);
                        bossHead.teleport(new Location(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), 2f));
                        loc.subtract(x,y,z);

                        if(bossHead.getLocation().getX() == 49 && bossHead.getLocation().getZ() == 90){
                            this.cancel();
                        }else if(bossHead.getLocation().getX() == 48 && bossHead.getLocation().getZ() == 91){
                            this.cancel();
                        }else if(bossHead.getLocation().getX() == 49 && bossHead.getLocation().getZ() == 91){
                            this.cancel();
                        }else if(bossHead.getLocation().getX() == 48 && bossHead.getLocation().getZ() == 90){
                            this.cancel();
                        }
                    }
                }.runTaskTimer(Main.getPlugin(Main.class), 3, 1);

Mein Ziel ist es, dass der "bossHead" (ArmorStand) zu einer bestimmten Location fliegt. Dafür habe ich den Vector erstellt, wie man oben sehen kann.
So. Nun fliegt der bossHead aber an der Location vorbei ins Unendliche. Ich weiß nicht, wo da der Fehler ist. Ich hatte anfangs nur eine Abfrage:

if(bossHead.getLocation().getX() == 49 && bossHead.getLocation().getZ() == 90){

Da das aber nicht funktioniert hat, habe ich die anderen noch mit eingefügt. Funktioniert jetzt aber immer noch nicht. Vielleicht sieht ja jemand den Fehler, ich sehe ihn nicht..

Und dann noch eine Frage: Der bossHead fliegt extrem schnell dort hin. Kann ich das verlangsamen? Hab schon probiert das Delay vom Scheduler selber zu erhöhen oder dieses +0.05 hab ich auch schon runter gesetzt von 0.1 bei der double. Aber es fliegt immer gleich schnell.

Danke für die Hilfe ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du versuchst eine Gleitkommazahl aus getX() oder getZ() mit einem Integer zu vergleichen.

Wenn der Kopf bei 49,000001 ist, wird das niemals wahr.

Du könntest hier die Gleitkommazahl abrunden, indem du zB

((int) bossHead.getLocation().getX()) == 49

verwendest.

 

Zum Thema mit "zu schnell": Du könntest den Richtungsvektor vorher normalisieren, d. h. auf Länge 1 bringen:

Vector dir = ziel.toVector().subtract(start.toVector()).normalize();

Dann kannst du mit dem hochzählen der Distanz das ganze viel besser steuern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Minuten schrieb boomer41:

Zum Thema mit "zu schnell": Du könntest den Richtungsvektor vorher normalisieren, d. h. auf Länge 1 bringen:

Wenn ich den Vector vorher normalisiere, dann fliegt der Kopf sonst wo hin. Also nicht mehr nur ins endlose x meistens, sondern auch noch ins endlose y..
Mal gucken, was passiert, wenn ich ihn nicht normalisiere

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Minuten schrieb boomer41:

 


((int) bossHead.getLocation().getX()) == 49

 

Auch das funktioniert irgendwie nicht..

Hier nochmal der aktuelle Code:

Location start = bossHead.getLocation();
                Location ziel = new Location(bossHead.getWorld(), 49.5, 130, 1.5, 90, 2);
                Location loc = bossHead.getLocation();
                new BukkitRunnable(){

                    double distance = 0;

                    Vector dir = ziel.toVector().subtract(start.toVector());

                    @Override
                    public void run(){
                        distance = distance + 0.1;
                        double x = dir.getX()* distance + 0.05;
                        double y = dir.getY()* distance;
                        double z = dir.getZ()* distance + 0.05;



                        loc.add(x, y, z);


                        sendEffectforAll(EnumParticle.FLAME, loc, 1);
                        bossHead.teleport(new Location(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), 2f));
                        loc.subtract(x,y,z);

                        if(((int) bossHead.getLocation().getX()) == 49 && ((int)bossHead.getLocation().getZ()) == 90){
                            this.cancel();
                        }else if(((int)bossHead.getLocation().getX()) == 48 && ((int)bossHead.getLocation().getZ()) == 91){
                            this.cancel();
                        }else if(((int)bossHead.getLocation().getX()) == 49 && ((int)bossHead.getLocation().getZ()) == 91){
                            this.cancel();
                        }else if(((int)bossHead.getLocation().getX()) == 48 && ((int)bossHead.getLocation().getZ()) == 90){
                            this.cancel();
                        }
                    }
                }.runTaskTimer(Main.getPlugin(Main.class), 3, 1);

Wie gesagt, wenn ich den Vector normalisiere, dann fliegt er ganz ganz weit noch nach oben. Und anhalten tut er ebenfalls nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Uffff okay, ich hab da nen Fehler gefunden. Ich hab bei der Abfrage unten bei Z "Yaw" von oben eingegeben.. Dann kanns auch nicht gehen. Aber warum fliegt er so schnell? Bzw. warum fliegt er schräg nach oben, wenn ich es normalisiere? Weil er bei der Location ebenfalls leicht nach oben schwebt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...
B
B