Jump to content
Reddi

Scheduler wird nicht gecancelled?

Recommended Posts

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 ^^

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...
B